2017-02-12 17 views
13

아니요, 영역 오프셋에 대해 말하는 것이 아닙니다. 예를 들어 지역에 따라 달라질 수 있습니다. DST. 사실 time zones maintained by IANA에 대해 이야기하고 있습니다. 이것들은 이 아니며 ISO 8601에서 지원하는이 맞지 않습니까?ISO 8601의 시간대 식별

ISO 8601과 같은 문자열 표현에서 시간대를 식별하는 것을 지원하는 플랫폼은 무엇입니까? 최신 Java 날짜/시간 라이브러리가 확장 된 ISO 8601 형식을 사용하고 있습니다. 2011-12-03T10:15:30+01:00[Europe/Paris]. (DateTimeFormatter API 참조)

표준 시간대 지정을 지원하기 위해 ISO 8601을 확장하기위한 일부 수렴 규칙 (예 : 다른 언어 및 플랫폼)이 있습니까?

+0

두 번째 글 머리 기호는이 질문을 다소 넓게 만듭니다. – chrylis

+0

[W3C 설명] (https://www.w3.org/TR/NOTE-datetime)을 읽는 방식은 정확합니다. ISO 8601은 영역 오프셋을 지원하지만 가변 오프셋이있는 시간대는 지원하지 않습니다 (일반적으로 여름 시간, IANA 시간대의 상당 부분을 차지함). –

+1

@ OleV.V. 링크 된 W3C 노트 문서는 실제 ISO 8601 표준의 간략한 개요입니다. 나는 훌륭한 [Wikipedia article on ISO 8601] (https://en.wikipedia.org/wiki/ISO_8601)과 [week date] (https://en.wikipedia.org/wiki/ISO_week_date)를 읽고, 아마도 표준 [초안] (https://duckduckgo.com/?q=ISO+8601+draft&t=osx&ia=web) (공식 표준은 유료화 벽 뒤에 있습니다). –

답변

13

나는 이것이 ISO 8601에서 지원되지 않는다는 것을 이해합니다. 맞습니까?

수정. ISO-8601은 표준 시간대 식별자와 관련이 없습니다. IANA/Olson TZ 이름은 "표준"이 아닙니다. 그것들은 우리가 가지고있는 가장 신뢰할만한 것입니다. (일부는 그들에게 사실상 기준을 고려할 수 있습니다.) 플랫폼이 지원하는 뭐

?

정확히 무엇이 지원 되나요? 귀하의 질문 중이 부분은 분명하지 않습니다. IANA 시간대를 지원한다는 뜻이라면 여기 저기에 있습니다. 일부 플랫폼에는 내장되어 있으며, 일부는 라이브러리에 의존합니다. ISO-8601 날짜 - 시간 오프셋 + 시간대 ID의 문자열 표현을 지원하려는 경우 일부 플랫폼에는이 코드가 있고 일부 코드에는 그렇지 않습니다. 더 많은 것을 알고 싶다면 더 구체적이어야합니다.

예를 들어 최신 Java 날짜/시간 라이브러리에서 ISO 8601 형식이 확장되어 있습니다. 2011-12-03T10 : 15 : 30 + 01 : 00 [유럽/파리] (DateTimeFormatter API를 참조하십시오.)

나는 DateTimeFormatter.ISO_ZONED_DATE_TIME에 대해 이야기하고 있다고 생각합니다. 워드 프로세서는 특히 말 :

ISO- 같은 날짜 - 시간 형식화 ...

...을 ISO-8601는 시간대를 추가하는 날짜 - 시간 형식을 상쇄 확장 된 확장합니다. 대괄호 의 섹션은 ISO-8601 표준의 일부가 아닙니다.

그래서 이것은 표준이 아닌 자바의 특정 형식입니다.

표준 시간대 지정을 지원하도록 ISO 8601을 확장하기위한 일부 수렴 규칙 (예 : 다른 언어 및 플랫폼)이 있습니까?

내가 아는 한 현재 ISO8601 타임 스탬프와 IANA 시간대 식별자를 단일 형식으로 결합하는 표준은 없습니다.하나는 포함하여, 그것을 여러 가지 방법을 나타낼 수 있습니다 :

  • 2011-12-03T10:15:30+01:00[Europe/Paris] (이 자바 8의 기본입니다)
  • 2011-12-03T10:15:30+01:00(Europe/Paris)
  • 2011-12-03T10:15:30+01:00 Europe/Paris
  • 2011-12-03T10:15:30+01:00 - Europe/Paris
  • 2011-12-03T10:15:30+01:00/Europe/Paris
  • 2011-12-03T10:15:30+01:00|Europe/Paris
  • 2011-12-03T10:15:30 Europe/Paris (+01) (N의 기본값입니다. ODA 시간) 당신이 찾고있는 것은 표준화 된 방식으로 API에 ZonedDateTime 또는 유사한 데이터를 포함하는 방법 인 경우

, 내 개인 추천은 별도의 필드에 시간대 이름을 전달하는 것입니다. 그렇게하면 데이터의 각 부분이 될 수있는만큼 좋은 결과를 얻을 수 있습니다. 예 : JSON :

{ 
    "timestamp": "2011-12-03T10:15:30+01:00", 
    "timezone": "Europe/Paris" 
} 
+0

또한 흥미롭게도 [Java ZonedDateTime docs] (https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html) 상단에 공백 구분 기호가있는 형식을 사용합니다. 브래킷의 ;) –

+0

"정확히 무엇을 지원합니까? 질문의이 부분이 불분명합니다." 글쎄, 나는 제목에 넣어 생각 ...하지만 충분히 공평 --- 나는 질문을 업데이 트했습니다. "ISO-8601 날짜 - 시간 오프셋 + 시간대 ID의 문자열 표현을 지원한다는 뜻이라면 일부 플랫폼은 이것을 가지고 있지만 일부는 그렇지 않습니다." 글쎄, 그건 내가 묻고있는 질문이다. 다른 플랫폼은 무엇을하고 있습니까? 누군가가 다른 예제를 줄 수 있기를 바랬는데, 자바가 단독으로 존재하는지 또는 어떤 수렴 추세를 따르고 있는지 알 수있었습니다. –

+0

"하나는 여러 가지 방법으로 표현할 수 있습니다 ..."사실 @MattJohnson, 나는 하루 종일 표현할 수있는 수백 가지 변형을 발명하여 여기에 앉아서 시간대를 표현할 수있었습니다. 문제는 새로운 접근 방식이 있는지 또는 Java 접근 방식 이외의 "야생 상태"에서 사용 사례가 있는지 여부입니다. –

9

Answer by Matt Johnson은 정확한 입력입니다. 나는 단지 몇 가지 생각을 덧붙일 것이다. 오프셋에서-UTC

offset-from-UTC

시간대 UTC 뒤로/앞으로 단지 시간, 분, 초 단위입니다. 혼자만해도 이것은 타임 라인상의 특정 순간에 날짜 시간을 만듭니다. 그러나 official time zone name을 포함하는 것만 큼 유익하지는 않습니다.

시간대 이름을 포함하는 표준은 아직 없지만 다른 사람들이 java.time 클래스의 선두를 따라 대괄호 안에 시간대 이름을 추가하기를 바랍니다. 사각 브래킷 부분을 자르지 않은 소프트웨어와 역 호환되도록 간단하게 자르기 때문에이 형식은 나에게 합리적입니다.

예 :
2011-12-03T10:15:30+01:00[Europe/Paris]. 데이터가 2011-12-03T10:15:30+01:00 인 경우 타임 라인에서 그 순간을 식별 할 수 있지만 적용 할 규칙이 무엇인지 모르기 때문에 다른 순간을 동일한 마음의 프레임으로 조정할 수는 없습니다. Europe/Zagreb, Africa/Brazzaville, Arctic/LongyearbyenEurope/Isle_of_Man과 같은 영역은 모두 +01:00의 오프셋을 공유하지만, Europe/Paris의 오프셋과는 다른 다른 조정이 가능할 수 있습니다. 따라서 3 일을 값 2011-12-03T10:15:30+01:00에 추가하려고하면 이러한 3 일 동안 발생할 수있는 DST 컷오버와 같은 조정이 적용될 필요가 있는지 모르기 때문에 실제로 결과를 충실하게 계산할 수 없습니다.

시간대는 Daylight Saving Time (DST)과 같은 예외 처리 규칙 세트를 정의합니다. 전 세계의 정치가들은 시간대를 조정하거나 재 정의하는 것을 즐깁니다. 따라서 이러한 규칙은 자주 변경됩니다. 시간대는 시간 경과에 따른 오프셋의 집합으로 생각할 수 있으며, 각 기간에는 특정 지역에서 특정 오프셋이 사용 된 역사의 많은 기간이 있습니다.

표준 시간대를 UTC 오프셋 값의 모음으로 생각할 수 있습니다. America/Los_Angeles에서 올해의 부분은 UTC보다 8 시간 늦으며, 올해의 일부는 UTC보다 7 시간 늦습니다. 그러면 해당 시간대의 일부로 2 점의 데이터가 수집됩니다.

지난 몇 년 동안 터키는 매년 전년도의 일부를 UTC보다 2 시간, 그리고 매년 3 시간 앞당겨 보냈습니다. 2016 년에는 무한대로 3 시간 머물렀다.따라서 시간대에있는 데이터의 여러 지점 Europe/Istanbul.

그냥 개인적으로 나는 심지어 2011-12-03T10:15:30+01:00 같은 값을 사용하여 훨씬 값이 표시되지 않는

UTC

를 사용합니다. 표준 시간대가 없으면 UTC 만 사용할 수도 있습니다. 이 경우 2011-12-03T09:15:30Z (오전 10시 대신 오전 9시).

일반적으로 가장 좋은 방법은 날짜 - 시간 값을 저장하고 교환 할 때 UTC를 사용하는 것입니다. UTC를 One-True-Time으로 생각하십시오., 구역 또는 오프셋 값은 단순한 변형입니다.

+0

가능한 경우 UTC를 사용하는 데 일반적으로 동의하십시오. 그러나 일부 유즈 케이스는 어색합니다. 논리가 과거 또는 미래의 임의의 시간 정보가 로컬 영역에있는 임의의 이벤트를 참조해야하는 경우 UTC 변환이 명확하지 않습니다. (예를 들어, 뉴욕 증권 거래소 (NYSE)는 앞으로 10 년 후인 3 월 두 번째 화요일에 어떤 시간을 열 것인가? 현지 시간은 대체로 동부 표준시 기준 오전 9시 30 분이지만 UTC는 DST 전환에 따라 달라지며 심지어 규칙에 따라 달라집니다 그 전에는 변함이 없다.) 그런 경우에, 지역적으로 구역 시간을 나타내는 표준을 갖는 것이 바람직 할 것이다. – Sumitsu

+1

@Sumitsu 완전히 동의합니다, 100 %. 나는 프로그래머가 (a) 자신의 편협한 시간대를 오가며 바뀌는 경향이 있고, (b) "지역적"(unzoned) 날짜 - 시간 값을 사용한다고 생각하는 경향이 있다는 것을 알기 때문에 반대 위치를 강조한다. 시간대 문제를 다루지 않아도됩니다. 그러나 LocalDateTime은 정치인들이 너무나 자주 부주의하게 너무 빨리 시간대를 재정의하기 때문에 NYSE 오픈과 같은 많은 상황에서 유용합니다. 예를 들어 작년에 터키는 단 몇 주 만에 DST에 머물기로 결정했습니다. –

+0

TZ 오프셋은 일부 * 클라이언트 상대 값을 수집 할 수 있습니다. 다른 목적을위한 TZ 이름만큼 강력하지는 않지만, "하루"를 시간과 구별 할 수있게 해주는 (주로 99 %의 경우 * 기록 시간에) 작은 단계를 제공합니다. '단일 스칼라'내에서 TZ 오프셋은 UZ에 대한 순수한 매핑이라는 점에서 TZ 이름에 좋은 속성을 가지고 있지만, '단일 스칼라'형식으로 TZ 이름을 캡쳐하여 향후 처리를 향상시킬 수는 있습니다. :} – user2864740