IT story

Java 8에서 UTC + 0 날짜를 얻는 방법은 무엇입니까?

hot-time 2020. 9. 10. 18:58
반응형

Java 8에서 UTC + 0 날짜를 얻는 방법은 무엇입니까?


Java의 Date 클래스에 문제가 있습니다. 날짜 클래스는 로컬 컴퓨터 날짜를 반환하지만 UTC-0이 필요합니다.

나는 봤는데 JavaScript에 대한 훌륭한 솔루션을 찾았지만 Java에는 유용하지 않습니다.

Java 8에서 UTC + 0 날짜를 얻는 방법은 무엇입니까?


Java 8을 사용하면 다음을 작성할 수 있습니다.

OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);

귀하의 의견에 답하기 위해 날짜로 변환하거나 (레거시 코드에 의존하지 않는 한 이유를 알지 못합니다) epoch 이후의 millis로 변환 할 수 있습니다.

Date date = Date.from(utc.toInstant());
long epochMillis = utc.toEpochSecond() * 1000;

tl; dr

Instant.now()

java.time

Java의 초기 버전에 번들로 제공되는 귀찮은 이전 날짜-시간 클래스는 Java 8 이상에 빌드 된 java.time 클래스 로 대체되었습니다 . Oracle Tutorial을 참조하십시오 . 대부분의 기능은 자바 6 7 백 포팅 된 ThreeTen - 백 포트 및 상기 안드로이드 적응 ThreeTenABP .

Instant

Instant있는 타임 라인에 잠시 나타냅니다 UTC 까지의 해상도를 가진 나노초 .

Instant instant = Instant.now();

toString메서드는 표준 ISO 8601 형식 중 하나를 사용하여 날짜-시간 값을 나타내는 텍스트가있는 String 개체를 생성합니다 .

String output = instant.toString();  

2016-06-27T19 : 15 : 25.864Z

Instant클래스는 java.time의 기본 빌딩 블록 클래스입니다. 일반적으로 가장 좋은 방법은 UTC로 날짜-시간 값을 추적, 저장 및 교환하는 것이므로 날짜-시간을 처리 할 때이 클래스를 사용해야합니다.

OffsetDateTime

그러나 Instant대체 형식으로 문자열을 생성하기위한 형식 지정 옵션이없는 등의 제한이 있습니다. 유연성을 높이 Instant려면에서 OffsetDateTime. offset-from-UTC를 지정하십시오 . java.time에서는 객체를 의미 ZoneOffset합니다. 여기서는 편리한 상수를 사용할 수 있도록 UTC (+00)를 고수하고 싶습니다 ZoneOffset.UTC.

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

2016-06-27T19 : 15 : 25.864Z

아니면 Instant수업을 건너 뛰십시오 .

OffsetDateTime.now( ZoneOffset.UTC )

이제 OffsetDateTime손에 개체를 사용 DateTimeFormatter하여 대체 형식의 텍스트로 String 개체를 만들 있습니다. .NET을 사용하는 많은 예제를 보려면 Stack Overflow를 검색하세요 DateTimeFormatter.

ZonedDateTime

특정 시간대의 벽시계 시간 을 표시 하려면 a ZoneId적용 하여 ZonedDateTime.

이 예에서는 몬트리올 시간대를 적용합니다. 여름에는 DST (일광 절약 시간제) 말도 안되는 상황에서 영역의 오프셋이 -04:00. 참고 어떻게 시간의 하루는 4 시간 이전에 출력에 15대신 19시간. Instant그리고 ZonedDateTime둘 다 두 개의 다른 렌즈를 통해 본 매우 동일한 동시 적 순간을 나타냅니다.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

2016-06-27T15 : 15 : 25.864-04 : 00 [미주 / 몬트리올]

변환

이전 날짜-시간 클래스를 피해야하지만 필요한 경우 이전 클래스에 추가 된 새 메서드를 사용하여 변환 할 수 있습니다. 여기서 우리는 java.util.Date.from( Instant )java.util.Date::toInstant.

java.util.Date utilDate = java.util.Date.from( instant );

그리고 다른 방향으로갑니다.

Instant instant= utilDate.toInstant();

마찬가지로 GregorianCalendar(의 하위 클래스 Calendar)에 추가 된 새 메서드를 찾아 java.time.ZonedDateTime.

최신 java.time과 레거시의 날짜-시간 클래스 유형 표.


java.time 정보

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

You may exchange java.time objects directly with your database. Use a JDBC driver compliant with JDBC 4.2 or later. No need for strings, no need for java.sql.* classes.

Where to obtain the java.time classes?

The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.


In Java8 you use the new Time API, and convert an Instant in to a ZonedDateTime Using the UTC TimeZone


In java8, I would use the Instant class which is already in UTC and is convenient to work with.

import java.time.Instant;

Instant ins = Instant.now();
long ts = ins.toEpochMilli();

Instant ins2 = Instant.ofEpochMilli(ts)

Alternatively, you can use the following:

import java.time.*;

Instant ins = Instant.now(); 

OffsetDateTime odt = ins.atOffset(ZoneOffset.UTC);
ZonedDateTime zdt = ins.atZone(ZoneId.of("UTC"));

Back to Instant

Instant ins4 = Instant.from(odt);

참고URL : https://stackoverflow.com/questions/26142864/how-to-get-utc0-date-in-java-8

반응형