1976 년 3 월 28 일부터 3 월 29 일까지 일어난 일은 java.util.gregoriancalendar로 무엇입니까?

StackOverflow https://stackoverflow.com//questions/10698470

문제

그레고리 칸탈 렌더를 사용하려고하면, 특정 날짜 이후 일 수를 계산하면서 특이성을 잃어 버렸습니다. 스칼라 인터프리터에서는 입력했습니다 :

scala>import java.util.GregorianCalendar
scala>import java.util.Calendar
scala>val dateToday = new GregorianCalendar(2012,Calendar.MAY,22).getTimeInMillis()
dateToday: Long = 1337637600000
scala>val days1 = (dateToday - (new GregorianCalendar(1976,Calendar.MARCH,28).getTimeInMillis())) / (1000*3600*24)
days1: Long = 13203
scala>val days2 = (dateToday - (new GregorianCalendar(1976,Calendar.MARCH,29).getTimeInMillis())) / (1000*3600*24)
days2: Long = 13203
.

1976 년은 1976 년이 윤년 문제가 있지만 일 1과 DAINS2는 1.이 특이점이 일어나는 1970 년 이래 역사의 유일한 순간입니다.

무슨 일이 일어나고 있는지 알고 싶어, 나는 이전에 언급 된 두 날짜의 차이를 계산하고 정확히 23 시간의 차이 만 제공합니다!그 날짜에 무슨 일이 있었 니?Wikipedia는 분명히 그것에 대해 아무것도 말하지 않습니다.

및 더욱 중요한 것은 특정 날짜 이후 실제 일수를 계산하는 방법

도움이 되었습니까?

해결책

플로트 부문의 옵션을 사용할 수없는 경우, 내가 생각할 수있는 가장 좋은 대답은 1 시간 (1000 * 3600)을 추가하면서 2 일간의 차이를 계산하는 것입니다.

scala> (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 28).getTimeInMillis()) + 1000*3600) / (1000 * 3600 * 24)
days1: Long = 13204
scala> (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 29).getTimeInMillis()) + 1000*3600) / (1000 * 3600 * 24)
days1: Long = 13203
.

더 이상 도약 시간으로 고통받지 않으므로 모든 날짜에 대해 작동해야합니다.

다른 팁

문제

일광 절약 일은 23 시간 만에 불과합니다.

1976 년 3 월 28 일, 1976 년 3 월 28 일에 일광 절약 날이었습니다. 최소한의 파리. 그날 오전 1시에서 2시 사이의 시간은 단순히 존재하지 않았습니다.

컴퓨터에 올바르게 얻을 수 있습니다.

scala> val days1 = (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 28).getTimeInMillis())) / (1000 * 3600 * 24)
days1: Long = 13203

scala> val days2 = (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 29).getTimeInMillis())) / (1000 * 3600 * 24)
days2: Long = 13202
.

나는 그날에 시간이 바뀌는 파리 나 다른 곳에서는 아무 곳이나 다른 곳에 있지 않습니다. 1976 년 4 월 25 일에 시간이 바뀌 었습니다. 그 날짜에 "건너 뛰는 날"행동을 얻습니다.

scala> val days3 = (dateToday - (new GregorianCalendar(1976, Calendar.APRIL, 25).getTimeInMillis())) / (1000 * 3600 * 24)
days3: Long = 13175

scala> val days4 = (dateToday - (new GregorianCalendar(1976, Calendar.APRIL, 26).getTimeInMillis())) / (1000 * 3600 * 24)
days4: Long = 13175
.

erwin이 이유가 잘못된 날짜의 차이 만 알리는 이유는 다른 일광 절약 일이 일광을 절약 하루에 일어날 때까지 일어난 25 시간까지의 모든 일이 발생한다는 것입니다. 수정됩니다.

솔루션

날짜 처리를 위해 더 나은 라이브러리를 사용하십시오. Joda-time 라이브러리가 올바르게 수행됩니다 (뿐만 아니라 더 나은 날짜 / 시간 프레임 워크가되는 것) :

import org.joda.time.Days
import org.joda.time.DateTimeConstants
import org.joda.time.DateMidnight

val d1 = new DateMidnight(1976, DateTimeConstants.APRIL, 25)
val d2 = new DateMidnight(1976, DateTimeConstants.APRIL, 26)
val x = Days.daysBetween(d1, d2).getDays()
println(x) // 1
.

DHG가 제가 생각하는 것을 지적했습니다 :이 날은 "일광 절약 시간"날입니다. 이 날이 23 시간 밖에되지 않으므로 하루 만에 유클리디아 부문이 0입니다.

실제로 GregorianCalendar 객체를 사용하는 것은 밀리 초의 날짜에만 사용되므로 정수로서 1 일만큼 나누는 것은 결과만을 자릅니다.

유클리드 (정수) 분할 대신 부동산 부문을 수행 한 다음 결과를 둥글게하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top