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

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

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

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



답변

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

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

귀하의 의견에 답하려면 날짜를 날짜로 변환하거나 (레거시 코드에 의존하지 않는 한 이유를 알 수 없습니다) epoch 이후 밀리 초로 변환 할 수 있습니다.

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

특정 시간대의 벽시계 시간 을 표시 하려면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 정보

java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 – 시간의 수업을 java.util.Date, Calendar, SimpleDateFormat.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 그리고 많은 예제와 설명을 위해 Stack Overflow를 검색하십시오. 사양은 JSR 310 입니다.

Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.

java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이나 클래스 가 필요하지 않습니다 . Hibernate 5 및 JPA 2.2는 java.time을 지원 합니다 .java.sql.*

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


답변

java8에서는 Instant 이미 UTC에 있고 작업하기 편리한 클래스를 .

import java.time.Instant;

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

Instant ins2 = Instant.ofEpochMilli(ts)

또는 다음을 사용할 수 있습니다.

import java.time.*;

Instant ins = Instant.now();

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

돌아가다 Instant

Instant ins4 = Instant.from(odt);


답변

Java8에서는 새로운 Time API를 사용하고 UTC TimeZone을 사용하여 Instant in을 ZonedDateTime으로 변환 합니다.


답변

Java 8의 한 줄 솔루션 :

public Date getCurrentUtcTime() {
    return Date.from(Instant.now());
}


답변