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의 프레임 워크는 나중에 자바 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 클래스는 어디서 구할 수 있습니까?
- Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 이상 -번들로 구현 된 표준 Java API의 일부입니다.
- Java 9 는 몇 가지 사소한 기능과 수정 사항을 가져 왔습니다.
- Java SE 6 및 Java SE 7
- 대부분의 java.time 기능은 ThreeTen-Backport의 Java 6 및 7로 백 포트됩니다 .
- 기계적 인조 인간
- 최신 버전의 Android (26+)는 java.time 클래스의 구현을 번들로 제공합니다 .
- 이전 Android (<26)의 경우 API desugaring으로 알려진 프로세스 는 원래 Android에 내장되지 않은 java.time 기능 의 하위 집합을 가져옵니다 .
- 설탕 제거가 필요한 것을 제공하지 않는 경우 ThreeTenABP 프로젝트는 ThreeTen-Backport (위에서 언급)를 Android에 맞게 조정합니다 . ThreeTenABP 사용 방법…을 참조하십시오 .
답변
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());
}
답변
