인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

망곰님의 프로필 이미지
망곰

작성한 질문수

[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)

D-Day Counter 날짜 계산 로직 구현

D-DAY앱 디데이 계산에 오류가 있는데 해결하고싶어요

작성

·

267

0

9월 19일과 9월 20일 선택 시 1일 차이로 잘 나옵니다.

하지만 8월 31일과 9월 1일 선택 시 0일 차이로 나옵니다.

Log찍어보면 두 날짜의 밀리초가 같게 나옵니다. 이유가 궁금합니다!

 

(다른 방법 찾아서 해도 밀리초를 변환해서 계산하는 방법은 다 같은 결과가 나왔습니다.)

 

package com.yndoo.dday

import android.app.DatePickerDialog
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.DatePicker
import android.widget.TextView
import org.w3c.dom.Text
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.GregorianCalendar
import java.util.concurrent.TimeUnit

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val startButton = findViewById<Button>(R.id.startBtn)
        val endButton = findViewById<Button>(R.id.endBtn)

        var startDate = ""
        var endDate = ""
        var calendar_start = Calendar.getInstance()
        var calendar_end = Calendar.getInstance()

        startButton.setOnClickListener {

            val today = GregorianCalendar()
            val year = today.get(Calendar.YEAR)
            val month = today.get(Calendar.MONTH)
            val day = today.get(Calendar.DATE)

            val dlg = DatePickerDialog(this, object: DatePickerDialog.OnDateSetListener{
                override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
                    startDate = "${year}${month+1}${dayOfMonth}"
                    Log.d("날짜확인1",startDate)
                    calendar_start.set(year, month+1, dayOfMonth)
                    calendar_start.apply {
                        set(Calendar.HOUR_OF_DAY, 0)
                        set(Calendar.MINUTE, 0)
                        set(Calendar.SECOND, 0)
                        set(Calendar.MILLISECOND, 0)
                    }
                }

            }, year, month, day)
            dlg.show()
        }
        endButton.setOnClickListener {

            val today = GregorianCalendar()
            val year = today.get(Calendar.YEAR)
            val month = today.get(Calendar.MONTH)
            val day = today.get(Calendar.DATE)

            val dlg = DatePickerDialog(this, object: DatePickerDialog.OnDateSetListener{
                override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
                    endDate = "${year}${month+1}${dayOfMonth}"
                    Log.d("날짜확인2",endDate)
                    calendar_end.set(year, month+1, dayOfMonth)
                    calendar_end.apply {
                        set(Calendar.HOUR_OF_DAY, 0)
                        set(Calendar.MINUTE, 0)
                        set(Calendar.SECOND, 0)
                        set(Calendar.MILLISECOND, 0)
                    }
                    val finalDate = TimeUnit.MILLISECONDS.toDays(calendar_end.timeInMillis - calendar_start.timeInMillis) + 1
                    //val finalDate = (calendar_end.timeInMillis - calendar_start.timeInMillis)/(24*60*60*1000) + 1
                    Log.d("@@@",TimeUnit.MILLISECONDS.toDays(calendar_start.timeInMillis).toString())
                    Log.d("@@@",TimeUnit.MILLISECONDS.toDays(calendar_end.timeInMillis).toString())

                    findViewById<TextView>(R.id.ddayText).setText("D+" + finalDate.toString())
                }

            }, year, month, day)
            dlg.show()

        }

    }
}

 

답변 1

0

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

안녕하세요 망곰님

사용하신 프로젝트 코드 전체를 압축해서 깃허브/구글 드라이브를 통해서 공유해주시면 살펴볼게요~
그리고 에러가 어떻게 났는지 스크린샷도 함께 주시면 도움드리기 좋을 것 같습니다!

망곰님의 프로필 이미지
망곰
질문자

강의와 같은 코드로 실행해도 날짜 카운트에 오류가 있습니다.
9월 19일과 9월 20일 선택 시 1일 차이로 잘 나옵니다.

하지만 8월 31일과 9월 1일 선택 시 0일 차이로 나옵니다.

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

안녕하세요 망공님

수강에 불편을 드려 죄송합니다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val startButton = findViewById<Button>(R.id.startBtn)
        val endButton = findViewById<Button>(R.id.endBtn)

        var startDate = ""
        var endDate = ""

        val calendar_start = Calendar.getInstance()
        val calendar_end = Calendar.getInstance()

        startButton.setOnClickListener {
            val today = GregorianCalendar()
            val year = today.get(Calendar.YEAR)
            val month = today.get(Calendar.MONTH)
            val day = today.get(Calendar.DATE)

            val dlg = DatePickerDialog(this, object : DatePickerDialog.OnDateSetListener{
                override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
                    startDate = year.toString() + (month+1).toString() + dayOfMonth.toString()
                    calendar_start.set(year, month, dayOfMonth)
                    Log.d("StartDate : ", startDate)
                }
            }, year, month, day)
            dlg.show()
        }

        endButton.setOnClickListener {
            val today = GregorianCalendar()
            val year = today.get(Calendar.YEAR)
            val month = today.get(Calendar.MONTH)
            val day = today.get(Calendar.DATE)

            val dlg = DatePickerDialog(this, object : DatePickerDialog.OnDateSetListener{
                override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
                    endDate = year.toString() + (month+1).toString() + dayOfMonth.toString()
                    calendar_end.set(year, month, dayOfMonth)
                    Log.d("EndDate : ", endDate)

                    val finalDate = TimeUnit.MILLISECONDS.toDays(calendar_end.timeInMillis - calendar_start.timeInMillis)


                    val textArea = findViewById<TextView>(R.id.finalDate)
                    textArea.setText(finalDate.toString())
                }
            }, year, month, day)
            dlg.show()
        }
    }
}

위와 같이 코드를 변경해보시겠어요?

실제 calendar_start calendar_end 에서

set 할 때 month에 +1를 해줘서 발생하는 문제입니다 :)

망곰님의 프로필 이미지
망곰
질문자

변경하니 해결됐습니다 감사합니다!

망곰님의 프로필 이미지
망곰

작성한 질문수

질문하기