본문 바로가기
안드로이드 코틀린

[Kotlin][Android] 수업 종료 날짜 계산하기 (주 단위)

by teamnova 2022. 5. 3.
728x90

java 버전은 https://stickode.tistory.com/236 를 확인해주세요.

 

안녕하세요!

 

오늘은 스틱 코드를 이용하여 수업 종료 날짜를 계산해 보겠습니다.

 

예를 들어,

주 1회,

총 수업 횟수 20번,

수업 시작일이 '2021-07-04' 에 시작한다 가정해 보았을 때

수업이 언제 끝나고 오늘로부터 얼마나 남았는지, 무슨 요일인지 계산을 해보도록 하겠습니다.

 

* 계산된 예시

앱을 실행하여 계산을 하면 다음과 같은 결과를 얻을 수 있습니다.

 

 

1. 목표 일 계산

먼저 시작일 포함 총 20회 수업을 들었을 때 마지막 수업 일을 구하는 메소드를 만들어 보도록 할게요.

    companion object {
        var dateFormat = "yyyy-MM-dd" // 전역 변수
    }

    // startDateStr : 시작일(String), week : 회차
    fun getDate(startDateStr: String?, week: Int): String {
        val cal: Calendar = Calendar.getInstance()
        val df = SimpleDateFormat(dateFormat)
        var startDate = Date()
        try {
            startDate = df.parse(startDateStr)
        } catch (e: ParseException) {
            e.printStackTrace()
        }
        // '(회차-1) * 7'일 구하기 -> 수업일로 부터 며칠 뒤 인지 계산
        val dateCount = (week - 1) * 7

        // cal 변수에 시작일을 대입
        // -> dateCount 만큼의 일 수 더하기
        cal.time = startDate
        cal.add(Calendar.DATE, dateCount)

        // 더해진 날짜를
        val afterDate: Date = cal.getTime()
        return df.format(afterDate)
    }

 

코드 중 (week - 1 ) 부분은 시작일을 수업 시작일로 계산하기 때문에 한주 마이너스 하였습니다.

 

 

2. 오늘부터 수업 종료까지 남은 일 수 구하기

다음으로 오늘 날짜로부터 수업 종료일까지 며칠 남았는지 계산을 해보도록 할게요

 


    fun getDue(endDate: String?): String {
        val calToday: Calendar = Calendar.getInstance()
        val calDDay: Calendar = Calendar.getInstance()
        val df = SimpleDateFormat(dateFormat)
        var dDay = Date()
        try {
            dDay = df.parse(endDate)
        } catch (e: ParseException) {
            e.printStackTrace()
        }
        // D-Day -> calDay 적용
        calDDay.time = dDay
        // 날짜 -> 밀리세컨트로 변환 -> 하루 단위로 계산
        val lToday: Long = calToday.timeInMillis / (24 * 60 * 60 * 1000)
        val lDDay: Long = calDDay.timeInMillis / (24 * 60 * 60 * 1000)
        // D-Day - 오늘
        val calculate = lDDay - lToday

        // long -> String
        return calculate.toString()
    }

 

수업 종료일과 오늘을 일 단위로 변경하여 두 날짜의 차이 계산을 계산 합니다.

 

 

3. 수업 마지막 날 요일 구하기

수업 마지막 날은 무슨 요일인지 확인해보는 코드 입니다.

    fun getDOW(endDate: String?): String {
        val cal: Calendar = Calendar.getInstance()
        val df = SimpleDateFormat(dateFormat)
        var dDay = Date()
        try {
            dDay = df.parse(endDate)
        } catch (e: ParseException) {
            e.printStackTrace()
        }
        cal.time = dDay
        return cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.KOREAN)
    }

 

 

4. 전체 코드

위에서 만든 메소드를 버튼 클릭 시 작동하도록 코드를 작성합니다.

MainActvitiy.java



class MainActivity : AppCompatActivity() {
    var convertBtn: Button? = null
    var writeDate: EditText? = null
    var writeWeek: EditText? = null
    var dayTv: TextView? = null
    var dueTv: TextView? = null
    var dowTv: TextView? = null
    var getStartDate: String? = null
    var getWeek = 0
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
        convertBtn?.setOnClickListener {
            getStartDate = writeDate!!.text.toString()
            getWeek = writeWeek!!.text.toString().toInt()
            val endDate = getDate(getStartDate, getWeek)
            dayTv!!.text = endDate
            val dDay = getDue(endDate)
            dueTv!!.text = dDay
            val dayOfWeek = getDOW(endDate)
            dowTv!!.text = dayOfWeek
        }
    }

    private fun init() {
        convertBtn = findViewById(R.id.convertButton)
        writeDate = findViewById(R.id.dateEditText)
        writeWeek = findViewById(R.id.timeEditText)
        dayTv = findViewById(R.id.dayTextView)
        dueTv = findViewById(R.id.dueTextView)
        dowTv = findViewById(R.id.dayofweekTextView)
    }


    companion object {
        var dateFormat = "yyyy-MM-dd" // 전역 변수
    }

    // startDateStr : 시작일(String), week : 회차
    fun getDate(startDateStr: String?, week: Int): String {
        val cal: Calendar = Calendar.getInstance()
        val df = SimpleDateFormat(dateFormat)
        var startDate = Date()
        try {
            startDate = df.parse(startDateStr)
        } catch (e: ParseException) {
            e.printStackTrace()
        }
        // '(회차-1) * 7'일 구하기 -> 수업일로 부터 며칠 뒤 인지 계산
        val dateCount = (week - 1) * 7

        // cal 변수에 시작일을 대입
        // -> dateCount 만큼의 일 수 더하기
        cal.time = startDate
        cal.add(Calendar.DATE, dateCount)

        // 더해진 날짜를
        val afterDate: Date = cal.getTime()
        return df.format(afterDate)
    }

    fun getDue(endDate: String?): String {
        val calToday: Calendar = Calendar.getInstance()
        val calDDay: Calendar = Calendar.getInstance()
        val df = SimpleDateFormat(dateFormat)
        var dDay = Date()
        try {
            dDay = df.parse(endDate)
        } catch (e: ParseException) {
            e.printStackTrace()
        }
        // D-Day -> calDay 적용
        calDDay.time = dDay
        // 날짜 -> 밀리세컨트로 변환 -> 하루 단위로 계산
        val lToday: Long = calToday.timeInMillis / (24 * 60 * 60 * 1000)
        val lDDay: Long = calDDay.timeInMillis / (24 * 60 * 60 * 1000)
        // D-Day - 오늘
        val calculate = lDDay - lToday

        // long -> String
        return calculate.toString()
    }

    fun getDOW(endDate: String?): String {
        val cal: Calendar = Calendar.getInstance()
        val df = SimpleDateFormat(dateFormat)
        var dDay = Date()
        try {
            dDay = df.parse(endDate)
        } catch (e: ParseException) {
            e.printStackTrace()
        }
        cal.time = dDay
        return cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.KOREAN)
    }


}

레이아웃

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:padding="8dp"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/startDateTextView"
        android:text="시작 일"
        app:layout_constraintStart_toStartOf="parent"
        android:textSize="32sp"
        app:layout_constraintTop_toTopOf="parent"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/timeTextView"
        android:text="회차"
        app:layout_constraintStart_toStartOf="@id/startDateTextView"
        app:layout_constraintTop_toBottomOf="@id/startDateTextView"
        android:textSize="32sp"
        />

    <EditText
        android:id="@+id/dateEditText"
        android:hint="연-월-일 ex)2021-12-17"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/startDateTextView"
        app:layout_constraintTop_toTopOf="@id/startDateTextView"
        app:layout_constraintBottom_toBottomOf="@id/startDateTextView"
        android:layout_marginStart="32sp"
        />

    <EditText
        android:id="@+id/timeEditText"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/startDateTextView"
        app:layout_constraintTop_toTopOf="@id/timeTextView"
        app:layout_constraintBottom_toBottomOf="@id/timeTextView"
        android:layout_marginStart="32sp"
        />

    <Button
        android:id="@+id/convertButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/timeEditText"
        android:text="변환"
        android:textSize="16sp"
        android:layout_marginTop="16dp"
        />


    <androidx.appcompat.widget.LinearLayoutCompat
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/convertButton"
        android:layout_marginTop="32dp"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="목표 일"
            android:textSize="32sp"
            />


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="남은 일수"
            android:textSize="32sp"
            />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="32sp"
            android:text="요일"
            />

    </androidx.appcompat.widget.LinearLayoutCompat>


    <androidx.appcompat.widget.LinearLayoutCompat
        android:layout_width="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/convertButton"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        android:orientation="vertical"
        android:layout_marginTop="32dp"
        android:gravity="end"
        >

        <TextView
            android:id="@+id/dayTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="32sp"
            />


        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            >
            <TextView
                android:id="@+id/dueTextView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="32sp"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="일"
                android:textSize="32sp"
                />

        </LinearLayout>

        <TextView
            android:id="@+id/dayofweekTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="32sp"
            />


    </androidx.appcompat.widget.LinearLayoutCompat>




</androidx.constraintlayout.widget.ConstraintLayout>

 

5. 실행