[Java] 왜이 두 번을 (1927 년에) 뺀 것이 이상한 결과를 낳았습니까?



Answers

현지 시간 불일치 가 발생했습니다.

현지 표준 시간이 일요일에 이르렀을 때, 1. 1 월 1928, 00:00:00 시계는 0:05:52 시간으로 토요일 31. 12 월 1927 23시 54 분 8 초 현지 표준 시간 대신

이것은 특히 이상한 것은 아니며 정치적 또는 행정적 조치로 인해 시간대가 변경되거나 변경 될 때 한 번에 또는 다른 곳에서 거의 모든 곳에서 발생했습니다.

Question

다음과 같은 프로그램을 실행하면 두 개의 날짜 문자열을 1 초 간격으로 참조하여 파싱하고 비교합니다.

public static void main(String[] args) throws ParseException {
    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    String str3 = "1927-12-31 23:54:07";  
    String str4 = "1927-12-31 23:54:08";  
    Date sDt3 = sf.parse(str3);  
    Date sDt4 = sf.parse(str4);  
    long ld3 = sDt3.getTime() /1000;  
    long ld4 = sDt4.getTime() /1000;
    System.out.println(ld4-ld3);
}

출력은 다음과 같습니다.

353

ld4-ld31ld4-ld3 (나는 1 ld4-ld3 가 예상 됨) 353 입니까?

날짜를 1 초 후에 변경하면 :

String str3 = "1927-12-31 23:54:08";  
String str4 = "1927-12-31 23:54:09";  

그러면 ld4-ld31 됩니다.

Java 버전 :

java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Dynamic Code Evolution Client VM (build 0.2-b02-internal, 19.0-b04-internal, mixed mode)

Timezone(`TimeZone.getDefault()`):

sun.util.calendar.ZoneInfo[id="Asia/Shanghai",
offset=28800000,dstSavings=0,
useDaylight=false,
transitions=19,
lastRule=null]

Locale(Locale.getDefault()): zh_CN



시간을 늘리면 다시 UTC로 변환 한 다음 더하거나 빼야합니다. 현지 시간 만 표시하십시오.

이렇게하면 시간이나 분이 두 번 발생하는 모든 기간을 살펴볼 수 있습니다.

UTC로 변환 한 경우 초를 추가하고 표시 할 현지 시간으로 변환하십시오. 11:54:08 pm LMT - 11:59:59 pm LMT를지나 11:54:08 pm CST - 11:59:59 CST가됩니다.




IMHO Java에서 널리 퍼져있는 암시 적 로컬라이제이션은 최대의 설계 결함입니다. 그것은 사용자 인터페이스를위한 것일 수도 있지만 솔직히 말해서 프로그래머가 목표 대상이 아니기 때문에 현지화를 기본적으로 무시할 수있는 일부 IDE를 제외하고 오늘날 사용자 인터페이스 용 Java를 실제로 사용하는 사람이 있습니다. 다음과 같이하여 (특히 Linux 서버에서) 수정할 수 있습니다.

  • 수출 LC_ALL = C TZ = UTC
  • 시스템 시계를 UTC로 설정하십시오.
  • 절대적으로 필요한 경우가 아니면 (예 : 표시 전용) 현지화 된 구현을 사용하지 마십시오.

Java Community Process 멤버에게는 다음을 권장합니다.

  • 지역화 된 메소드를 기본값이 아닌 사용자가 명시 적으로 현지화를 요청하도록합니다.
  • 대신 UTF-8 / UTC를 FIXED 기본값으로 사용하십시오. 이와 같은 스레드를 생성하려는 경우를 제외하고는 다른 것을 할 이유가 없습니다.

내 말은, 전역 정적 변수가 반 OO 패턴이 아닌가? 어떤 초보적 인 환경 변수에 의해 주어진 퍼베이시브 디폴트는 없습니다 .......




그런데 유감 스럽지만 시간 불연속이 약간 옮겼습니다.

JDK 6 2 년 전, JDK 7 바로 최근 업데이트 25 .

배울 교훈 : 어쩌면 디스플레이를 제외하고는 모든 비용으로 비 UTC 시간을 피하십시오.






Links