왜 3월 30일 및 2020년 3월 1일의 차이는 잘못 이십팔일 대신 29 주는가?

조 :
TimeUnit.DAYS.convert(
   Math.abs(
      new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("30-03-2020 00:00:00").getTime() - 
      new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("1-03-2020 00:00:00").getTime()
   ),
   TimeUnit.MILLISECONDS)

결과는 28이며 29 시간대 / 위치가 문제가 될 수 있어야한다?

안드레아스 :

문제는 (2020년 3월 8일 (일요일)에) 일광 절약 시간 이동의 존재 때문이다 이십팔일 및 23시간 그 날짜 사이. TimeUnit.DAYS.convert(...) 절단 이십팔일 그 결과를.

문제를 (I 미국 동부 시간대에있어)를 참조하십시오 :

SimpleDateFormat fmt = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
long diff = fmt.parse("30-03-2020 00:00:00").getTime() -
            fmt.parse("1-03-2020 00:00:00").getTime();

System.out.println(diff);
System.out.println("Days: " + TimeUnit.DAYS.convert(Math.abs(diff), TimeUnit.MILLISECONDS));
System.out.println("Hours: " + TimeUnit.HOURS.convert(Math.abs(diff), TimeUnit.MILLISECONDS));
System.out.println("Days: " + TimeUnit.HOURS.convert(Math.abs(diff), TimeUnit.MILLISECONDS) / 24.0);

산출

2502000000
Days: 28
Hours: 695
Days: 28.958333333333332

해결하려면, DST가없는 시간대를 사용, 예를 들어, UTC :

SimpleDateFormat fmt = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
long diff = fmt.parse("30-03-2020 00:00:00").getTime() -
            fmt.parse("1-03-2020 00:00:00").getTime();

산출

2505600000
Days: 29
Hours: 696
Days: 29.0

추천

출처http://10.200.1.11:23101/article/api/json?id=6232&siteId=1