inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

403

망곰

작성한 질문수 2

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()

        }

    }
}

 

android kotlin firebase

답변 1

0

개복치개발자

안녕하세요 망곰님

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

0

망곰

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

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

1

개복치개발자

안녕하세요 망공님

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

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를 해줘서 발생하는 문제입니다 :)

0

망곰

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

주사위앱 소개 및 레이아웃 설정 문제

0

60

2

안드로이드 에뮬레이터가 실행이 안 되요...ㅠ

0

105

2

30 강 소스 좀 올려 주십시요

0

81

2

onBackPressed 함수가 동영상 하고 다르게 동작합니다.

0

92

2

ListView 초기 실행 안됩니다.

0

96

2

코딩을 완료하고난후 앱 실행시 자동 종료

0

73

2

datavinding에서 오류가 납니다.

0

54

1

안드로이드 스튜디오 버전 차이로 초기 empyt activity 선택하면 안됩니다.

0

114

2

context의 구별에 대하여

0

70

2

"프롤로그에서 ..." 오류 관련해 직전 질문에 대한 추가 질문입니다.

0

70

2

"프롤로그에서 콘텐츠가 허용되지 않습니다." 오류

0

159

3

해결완료

1

188

2

databinding 설정후 run하면 에러(해결)

0

223

2

databinding 설정 이후 실행시 에러

0

274

4

안드로이드 입문하는 사람입니다.

0

71

1

Firebase uid

0

78

3

activity_main 화면 다름

0

116

2

강의화면과 다른데 맞게진행되는것인가요...????

0

107

2

파이어베이스 질문

0

76

2

ActivityMainBinding에 오류가 납니다

0

136

2

선생님 onBackPressed 작동이 안되는거 같습니다

0

119

2

>app>res>layout 이 존재하지 않습니다.

0

119

2

안드로이드 스튜디오 미어캣 버전 사용 한글 깨짐

0

750

2

안드로이드 스튜디오 오류 발생 시 대처 방법은 요?

0

289

2