2012-01-18 4 views
8

예, Java 및 Javascript의 Date에 대한 또 다른 질문입니다.Javascript 날짜 및 java.util.Date 생성자 인수

시간대는 Java 및 브라우저 (Chrome) 모두 GMT + 4 (모스크바)입니다.

<script language="javascript"> 
    var d = new Date(170798400000); 
    document.write(d); 
</script> 

을 제공합니다 : 일 6월 01 1975 0시 0 분 0 초 GMT + 0400 (러시아어 표준 시간)

public class Test { 
    public static void main(String[] args) { 
     java.util.Date d = new java.util.Date(170798400000L); // the same epoch value! 
     System.out.println(d); 
    } 
} 

을 제공합니다 : 31 23시 0분 0초 MSK 1975

만약 토 월 나는 시대 가치를 2011-2012 년 (일광 절약이 러시아에서 취소 된 후)으로 바꾼다. 결과물은 괜찮다. 시간대 업데이터 도구가 정상적으로 실행되었습니다.

버그 또는 문서에 기재된 기능입니까? 형식을 지정하고 YYYY-MM-dd HH : mm : SS 정도와 같이 다시 구문 분석하는 것을 제외하면이 방법을 사용할 수 있습니까?의 javadoc에서

:

는 Date 객체를 할당하고 "신기원"로 알려진 표준 기본 시간 이후의 지정된 밀리 세컨드 수를 나타냅니다 초기화 (긴 날짜)

날짜 년 1 월 1 일 , 1970, 00:00:00 GMT. 자바 스크립트 참조에서

:

새로운 날짜 (밀리 초)

밀리 초 - 7 월 1970 년 1 이후의 밀리 초 수를 나타내는 정수 값 0시 0 분 0 초 UTC (유닉스 신기원).

+0

아마도 "시간대 변경"과 관련이 있습니다. http://en.wikipedia.org/wiki/Moscow_Time –

+0

분명히 있습니다. 그것은 날짜 생성자가 자바 스크립트에서 더 이상 사용할 수 없다는 것을 의미합니까? – ike3

+0

글쎄, 그들 중 하나가 옳은 대답을주고 있지만 다른 하나는 그렇지 않다면 나는 다른 하나가 버그를 가지고 있다고 말하고 싶다 :-) 자바가 올바르거나 JavaScript인가? 나는 Java 버전이 정답을 줄 것을 기대하지만, 이는 단지 의문 일뿐입니다. – Pointy

답변

1

버그 또는 문서에 수록된 기능입니까?

이것은 자바와 관련된 버그가 아닙니다. 적어도, 나는 그것을 주장 할 수있는 방법을 찾지 못했다.

브라우저의 Javascript 엔진이 "GMT + 4"로 변환 된 시간을 반환합니다. GMT + 4와는 다른 MSK입니다 (귀하의 의견에 명시된 바와 같이). Javascript는 MSK에 대해 알지 못해 버그로 간주되지 않지만 기능이 부족합니다. 아마도 js는 시간대에 대한 자세한 지식이 없기 때문에 "틀린"것이지만 버그가 아닙니다.

YYYY-MM-dd HH : mm : SS 정도와 같이 형식을 지정하고 다시 구문 분석하는 경우를 제외하면이 방법을 사용할 수 있습니까?

임의의 시간대 세부 정보를 모두 추적하려면 많은 작업이 필요합니다. 나는 자바 스크립트에 사용할 수있는 모든 코드베이스가 없다는 것을 알고있다. 따라서 진정한 MSK를 사용하려면 직접 변환을 직접 코딩해야합니다.

1

인간의 경우 시간 표시 (예 : "Sun Jun 01 1975 00:00:00 GMT+0400")가 사용됩니다. 시간 값 (1970 년 1 월 1 일 이후의 밀리 초)은 저장 및 계산에 사용됩니다.

버그가 없습니다. 자바 스크립트에서, 스펙에 따르면 문자열 표현의 내용은 구현에 따라 다릅니다.Java에서는 문서에 따라 일광 절약 시간이 일 수 있으며 일 수 있습니다. JavaScript specification에서

:

15.9.5.2 Date.prototype.toString ()

이 기능은 문자열 값을 반환합니다. String의 내용은 구현 -> 종속이지만 현재 시간대의 날짜를 사람이 읽을 수있는 형식으로 표현하기위한 것입니다.

Java documentation 가입일

:

java.util.Date, public String toString() 

Converts this Date object to a String of the form: dow mon dd hh:mm:ss zzz yyyy 

where: 
... 
zzz is the time zone (and may reflect daylight saving time).` 
0

TL; DR

Instant.ofEpochMilli(170_798_400_000L) 

1975-05-31T20 : 00 : 00Z

... ... 및

,617,
Instant.ofEpochMilli(170_798_400_000L) 
     .atZone(ZoneId.of("Europe/Moscow")) 

1975-05-31T23 : 00 + 03 : 00 [유럽/모스크바]

live code를 참조하십시오. java.time

현대적인 방법을 사용

나중에 자바 8에 java.time 클래스를 사용합니다.

Java에서 기존의 오래된 날짜 - 시간 클래스를 사용하고 있습니다. 이러한 클래스의 많은 문제 중에는 문자열을 생성하는 동안 현재 기본 표준 시간대를 적용하는 의도가 있지만 혼란 스럽기는 데있는 Date::toString 메서드의 기능이 있습니다. 내부 값은 실제로는 항상 UTC로 표시되지만 toString은 사실 Date에 시간대가 있다는 환상을 만듭니다. 귀하의 MSK 수수께끼에 대한 설명입니다.

[입니다. Date에 깊이 묻힌 시간대이지만이 토론과 관련이 없습니다. 그 오래된 Date/Calendar 수업은 끔찍한 혼란입니다. 다행스럽게도 Java는 이제 모든 플랫폼에서 동급 최고의 날짜 - 시간 프레임 워크를 갖습니다. java.time.]

입력은 1970-01-01T00 : 00 : 00Z의 Unix 신기원 이후로 밀리 초를 나타냅니다.

Instant 클래스는 nanoseconds (소수 자릿수 9 자릿수까지)의 해상도로 UTC의 타임 라인에있는 순간을 나타냅니다. 이 클래스는 입력 된 숫자를 직접 파싱 할 수 있습니다.

Instant instant = Instant.ofEpochMilli(170_798_400_000L) ; 

instant.toString() : 1975-05-31T20 : 00 : 00Z 특정 지역의 wall-clock time의 렌즈를 통해 같은 순간을보고 싶다면

는, 시간을 적용 존.ZoneId을 적용하여 ZonedDateTime 개체를 가져옵니다.

ZoneId z = ZoneId.of("Europe/Moscow") ; 
ZonedDateTime zdt = instant.atZone(z) ; 

1975-05-31T23는 : 00 + 03 : 00 [유럽/모스크바]

자바 스크립트 라이브러리 라이브러리는 자바 스크립트 에 전화 잘못

결과입니다 오프셋이 +04 : 00 인 올바르지 않습니다. According to Wikipedia, 1930 년에서 1981 년까지의 모스크바 시간은 3 시간 전보다 +03 : 00이었다. java.time 프레임 워크는 1975 년 동안 +03 : 00의 정확한 결과를 산출합니다. 자세한 내용은 Time in Russia을 참조하십시오. 주의 사항 : 나는 러시아/소비에트 시대에는 전문가가 아니다. java.time

소개


java.time 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 java.util.Date, Calendar, & SimpleDateFormat과 같이 문제가있는 이전 legacy 날짜 - 시간 클래스를 대체합니다.

maintenance mode에있는 Joda-Time 프로젝트는 java.time 클래스로의 마이그레이션을 권장합니다.

자세히 알아 보려면 Oracle Tutorial을 참조하십시오. 그리고 많은 예제와 설명을 위해 스택 오버플로를 검색하십시오. 사양은 JSR 310입니다.

어디에서 java.time 클래스를 얻을 수 있습니까?

ThreeTen-Extra 프로젝트는 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 가능성을 입증합니다. 여기에 Interval, YearWeek, YearQuartermore과 같은 유용한 클래스가 있습니다.