java 자바 date - 왜이 두 번을 (1927 년에) 뺀 것이 이상한 결과를 낳았습니까?





4 Answers

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

현지 표준 시간이 일요일에 이르렀을 때, 1 1. 1928 년 1 월, 00:00:00 시계가 0:05:52 시간으로 토요일 31. 12 월 1927, 23:54:08 현지 표준 시간으로 되돌아갔습니다.

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

gettime timezone 변경

다음과 같은 프로그램을 실행하면 2 초 간격으로 참조하는 두 개의 날짜 문자열을 구문 분석하고 비교합니다.

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가됩니다.




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

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

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




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

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

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

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

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




Related