source

Java 8에서 기본 Zone Offset을 얻는 방법

factcode 2022. 9. 12. 11:35
반응형

Java 8에서 기본 Zone Offset을 얻는 방법

8을 사용합니다.ZoneId.default() 디폴트 「」를 할 수 .ZoneId 「」를 하는 ZoneOffset

i i i i i i 。ZoneId몇 가지 이 있고 각 규칙에는 "discription"이 .ZoneOffset, ,, ,, ,, ,, ,, ,, ,ZoneId를 개 수 .ZoneOffset

dr;dr

OffsetDateTime.now().getOffset()

다만, UTC로부터의 오프셋이 아닌 타임 존을 사용하는 것이 좋습니다.

ZoneId.systemDefault()

오프셋과 시간대

Offset-from-UTC는 시간, 분, 초의 수에 불과하며, 그 이상은 아닙니다.예를들면,-08:00 UTC 8시간 것을 의미합니다.+05:45UTC보다 5시간 45분 빠른 것을 의미합니다.

타임존은 특정 지역 사람들이 사용하는 오프셋에 대한 과거, 현재 및 미래의 변경 이력입니다.일광 절약 시간(DST)과 같은 이상 징후는 특정 기간 동안 오프셋의 변화를 일으키는 경우, 과거에 발생한 경우, 그리고 정치인들이 계획된 변화를 발표했을 때 시간에 따라 추적됩니다.

알고 있을 때 존을 사용하는 것이 좋습니다.

모든 영역의 오프셋은 시간에 따라 달라집니다.예를 들어 미국의 DST는 1년 중 절반 정도 오프셋을 1시간 이동한 후 나머지 절반 동안 오프셋으로 되돌립니다.타임존의 전체 목적은 오프셋의 변화를 문서화하는 것입니다.

따라서 날짜 없이 오프셋을 요청하는 것은 정말 의미가 없습니다.예를 들어 올해 일부에서는 오프셋은 다음과 같습니다.-08:00 중 에는 그렇다-07:00DST 중 。

OffsetDateTime

다음으로 모멘트를 로 지정하고 를 추출합니다.

OffsetDateTime odt = OffsetDateTime.now ();
ZoneOffset zoneOffset = odt.getOffset ();

odt.toString(): 2017-01-02T15:19:47.162-08:00

zoneOffset.toString(): -08:00

★★★now메서드는 실제로 JVM의 현재 기본 시간대를 암묵적으로 적용하고 있습니다.항상 원하는/예상 시간대를 지정하여 명시할 것을 권장합니다.현재의 디폴트존을 사용하고 싶은 경우라도, 그 의도를 명확하게 하기 위해서 명시적으로 말해 주세요.디폴트 타임존을 의도했는지 프로그래머에게 자주 있는 일이기 때문에 타임존을 고려하지 않았는지에 대한 불명확함을 해소합니다.를 호출합니다.

OffsetDateTime odt = OffsetDateTime.now ( ZoneId.systemDefault () );
ZoneOffset zoneOffset = odt.getOffset ();

ZoneId.systemDefault().toString(): America/Los_Angeles

odt: 2017-01-02T15:19:47.162-08:00

zone Offset Of Odt : -08:00

디폴트 존에 의존하기 위한 주의사항:이 기본값은 JVM 내의 임의의 스레드 내의 임의의 코드로 언제든지 변경할 수 있습니다.중요한 경우 사용자에게 원하는 시간대를 묻습니다.

그 시간의 오프셋을 합계 초수로 지정할 수 있습니다.

int offsetSeconds = zoneOffset.getTotalSeconds ();

오프셋 초: -28800

ZonedDateTime

다른예로는 '있다'는 것입니다.아마도 당신은 올해 퀘벡에서 크리스마스 날에 오프셋이 무엇인지 알고 싶을 것이다.을 합니다.America/Montreal, 를 취득하여 오프셋을 요구합니다.ZoneOffset★★★★★★ 。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate ld = LocalDate.of( 2017 , 12 , 25 );
ZonedDateTime zdtXmas = ld.atStartOfDay( z );
ZoneOffset zoneOffsetXmas = zdtXmas.getOffset();

zdtXmas.toString(): 2017-12-25T00:00-05:00[미국/몬트리올]

zoneOffsetXmas.toString(): -05:00

zoneOffsetXmas.getTotalSeconds(): -18000

Table of date-time types in Java, both modern and legacy.

ZoneId

yanys의 코멘트에서 제시된 바와 같이 특정 항목에 대해 질문할 수 있습니다.ZoneOffsetInstant이 클래스는 타임라인상의 순간을 UTC 단위나노초(최대 소수점 이하 9자리)의 분해능으로 나타냅니다.

이것은 같은 행선지로 가는 또 하나의 루트입니다.★★★★★★★★와 같이OffsetDateTime ★★★★★★★★★★★★★★★★★」ZonedDateTime위에서 설명한 바와 같이 (a) 시간대와 (b) 시간을 지정한다.

Instant instant = zdtXmas.toInstant();
ZoneOffset zo = z.getRules().getOffset( instant );

ZoneId: 미국/몬트리올: 2017-12-25T05:00:00Z의 경우 ZoneOffset은 -05:00입니다.

이 예제의 코드는, IdeOne.com 에서 확인할 수 있습니다.

ZoneOffset.systemDefault– ★★★★★★★★★★★★★★★★★★*

ZoneOffset, 서브클래스, ZoneId는 메서드를 상속하는 것으로 문서화되어 있습니다.그러나 이것은 실제로 효과가 없습니다.

ZoneOffset zoneOffset = ZoneOffset.systemDefault() ;  // Fails to compile.

오류: 호환되지 않는 유형: ZoneId를 ZoneOffset으로 변환할 수 없습니다.

이 컴파일 실패가 버그인지 기능인지 확실하지 않습니다.한 바와 같이 하는 것은 의미가 되므로, 「Default 은 「Date-time」으로 할 수 있습니다.그래서 아마ZoneOffset.systemDefault반드시 실패할 것이다.그러나 문서에는 설명과 함께 그렇게 기재되어 있어야 합니다.

이 문제에 대처하기 위해 문서가 실패했을 때 버그를 제출하려고 했지만, 어디서 어떻게 그런 버그 보고서를 제출해야 할지 결정하지 못하고 있습니다.

태양시 대 정치시

오프셋과 타임존에 대해 좀 더 자세히 설명하겠습니다.

태양 시간은 선사시대부터 사용되어 왔으며, 태양이 바로 머리 위에 있는 때를 주목하여 매일 추적해 왔다.땅에 막대기를 찔러서 그 그림자를 보세요.그림자가 가장 짧을 때, 그림자가 줄어들기 보다는 커지기 시작할 때, 당신은 지금이 정오라는 것을 안다.해시계를 사용하여 시간을 추적합니다.

태양시간과 함께 이 마을 저 마을로 이동하면서 조금 늦게 정오가 찾아옵니다.동쪽으로 이동하면 정오가 조금 더 빨리 도착한다.그래서 모든 마을은 같은 경도를 따라 북쪽과 남쪽에 있는 마을들과만 공유되는 그들만의 정오가 있다.

태양 시간은 현대 시대에 대부분 버려졌다.기차, 전신, 전화가 도착함에 따라, 시간적으로 조정해야 할 필요성도 증가했습니다.그래서 거의 태양 시간인 정오에 해당하는 지점이 선택되었고, 서쪽과 동쪽으로 수 마일 떨어진 넓은 땅은 모두 시계로 12시를 공유한다고 선언되었습니다. 그리니치 프라임 자오선 이나 뒤나 같은 시간이 상쇄됩니다.그래서 모든 열차가 눈에 띄게 시계를 표시하여 마을에 태양 시간보다 더 큰 지역의 표준 시간을 알리는 전통이 시작되었다.일반적으로, 그 시간대 지역의 서쪽 가장자리에 있는 마을에서는 해가 지기 조금 에 기차역 시계가 12시를 가리키게 됩니다.동쪽에 위치한 마을의 시계는 태양이 머리 위로 떠오른 지 얼마 되지 않아 12시를 가리키고 말했다.

전 세계 정치인들은 사법권의 상계(上界)를 바꾸는 경향을 보였다.그 이유는 다양합니다.외교, 전쟁, 점령, 서머타임(DST)의 어리석음 등입니다.이유는 다양하지만, 그 변화는 놀라운 빈도로 나타난다.표준 시간대는 이러한 변경 이력을 추적하기 위해 영역에 붙여진 이름입니다.따라서 UTC로부터의 오프셋은 본초 자오선보다 몇 시간 앞 또는 뒤에 있습니다.타임존은 과거, 현재 및 미래의 역사가 특정 지역의 오프셋에 변경되는 훨씬 더 많은 입니다.오늘날 두 인접 지역은 UTC와 같은 상계점을 공유하고 있지만 과거나 미래에는 정치인들의 변덕이나 논리에 따라 다를 수 있다.

이 현대 time-tracking 정치인들에 의해 정의된 지리학과는 거의 상관이 없다는 것을 의미한다.예를 들어, 인도의 거대한 나라 오늘 단일 시간대(+05의 offset-from-UTC시 30분) 가지고 있다.그래서 태양 정오(태양 바로 머리 위에 머리)한시간 간격이 있는 방대한 아대륙에 걸쳐 여러 장소에 있다.인도의 정치인들 이 그들의 다양한 민주주의 통일을 돕기로 결심했다.전 세계 다른 예에서 보면, 우리는 지역 그런 그들의 불쾌한 이웃 나라보다, 또는 관계 해빙기로 이웃으로서 최근 북한은 남한에 맞는 변화를에서 보듯이 그 선택 다른 것으로 국제 관계의 상징으로 그들의 시간대를 이용하는 것을 보고.그래서, 요즘 태양 시간은 겨우 한 time-tracking에 몇가지 사항에서.


java.time 정보

java.time 프레임워크는 Java 8 이후에 포함되어 있습니다.이러한 클래스는 , 및 등 문제가 많은 오래된 레거시 날짜 시간 클래스를 대체합니다.

자세한 내용은 Oracle 자습서를 참조하십시오.또한 Stack Overflow를 검색하여 많은 예와 설명을 확인하십시오.사양은 JSR 310입니다.

현재 유지보수 모드에 있는 Joda-Time 프로젝트는 java.time 클래스로의 이행을 권장합니다.

java.time 객체를 데이터베이스와 직접 교환할 수 있습니다.JDBC 4.2 이후준거한JDBC 드라이버를 사용합니다.스트링도 필요 없고java.sql.*반.휴지 상태 5 및 JPA 2.2는 java.time을 지원합니다.

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

Table of which java.time library to use with which version of Java or Android

목적에 따라서는 완전히 우회할 수 있습니다.

은, 「」뿐이라고 하는 것입니다.ZoneOffset★★★★★★★★★★★★★★★★★,LocalDateTime.ofEpochSecond() 라고 치환할 수 .

ZoneOffset offset = OffsetDateTime.now().getOffset();
LocalDateTime dt1 = LocalDateTime.ofEpochSecond(seconds, 0, offset);

와 함께

LocalDateTime dt2 = LocalDateTime.ofInstant(
    Instant.ofEpochSecond(seconds), 
    ZoneId.systemDefault());

서 ''는dt1.equals(dt2)true.

언급URL : https://stackoverflow.com/questions/41427384/how-to-get-default-zoneoffset-in-java-8

반응형