새 Date
객체를 만들면 현재 시간으로 현지 시간대로 초기화됩니다. GMT에서 현재 날짜와 시간을 어떻게 알 수 있습니까?
답변
java.util.Date
UTC와 관련하여 가장 일반적으로 생각되지만 특정 시간대는 없습니다. 그것이 현지 시간이라고 생각하는 이유는 무엇입니까?
정확히 말하면 a 내의 값 java.util.Date
은 UTC 1970 년 1 월 1 일 자정에 발생한 유닉스 시대 이후의 밀리 초입니다. 동일한 시간대는 다른 시간대에서도 설명 할 수 있지만 일반적인 설명은 UTC를 기준으로합니다. 고정 된 에포크 (epoch) 이후 수 밀리 초이므로java.util.Date
현지 시간대와 상관없이 특정 순간에 전세계 이 동일합니다.
문제는 현지 시간대를 사용하는 캘린더 인스턴스를 사용하거나 현지 시간대를 사용하는 캘린더 인스턴스를 통해 Date.toString()
또는SimpleDateFormat
인스턴스 기본적으로 입니다.
이것이 문제가되지 않으면 샘플 코드를 게시하십시오.
그러나 어쨌든 훨씬 명확한 API를 제공하는 Joda-Time 을 사용하는 것이 좋습니다 .
답변
tl; dr
Instant.now() // Capture the current moment in UTC.
해당 값을 나타내는 문자열을 생성하십시오.
Instant.now().toString()
2016-09-13T23 : 30 : 52.123Z
세부
으로 존 소총으로 정답 언급하는 java.util.Date 객체는 없습니다 어떤 시간대를 † . 그러나 해당 toString
구현은 해당 날짜-시간 값의 문자열 표현을 생성 할 때 JVM의 기본 시간대를 적용합니다. 순진한 프로그래머에게는 혼란스럽게도 Date 에는 시간대가있는 것 같지만 그렇지 않습니다.
java.util.Date
, j.u.Calendar
그리고 java.text.SimpleDateFormat
자바와 함께 번들 클래스는 악명 골칫거리입니다. 피하십시오. 대신, 유능한 날짜 / 시간 라이브러리 중 하나를 사용하십시오.
- Java 8의 java.time. * 패키지
- 조다 타임
java.time (자바 8)
Java 8 은 뛰어난 java.time. * 패키지 를 제공하여 이전 java.util.Date/Calendar 클래스를 대체합니다.
UTC / GMT로 현재 시간을 얻는 것은 간단한 일 라이너입니다…
Instant instant = Instant.now();
이 Instant
클래스는 java.time의 기본 빌딩 블록으로, 나노초 의 해상도로 UTC 의 타임 라인의 순간을 나타냅니다 .
Java 8에서는 현재 순간이 최대 밀리 초 해상도로 캡처됩니다. 자바 9 신선한 구현 제공 의 Clock
호스트 컴퓨터의 시계 하드웨어의 능력에 따라,이 클래스의 전체 나노초 능력을 최대로 캡처에게 현재의 순간을.
이 toString
메소드는 하나의 특정 ISO 8601 형식을 사용하여 해당 값의 문자열 표현을 생성 합니다 . 이 형식 은 초 를 나타내는 데 필요한 0, 3, 6 또는 9 자리 숫자 ( 밀리 초 , 마이크로 초 또는 나노초 )를 출력합니다.
보다 유연한 서식 또는 기타 추가 기능을 원하면 UTC 자체 ( ZoneOffset.UTC
constant )에 대해 UTC에서 오프셋을 0으로 적용하여을 얻습니다 OffsetDateTime
.
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );
콘솔로 덤프…
System.out.println( "now.toString(): " + now );
달릴 때…
now.toString(): 2014-01-21T23:42:03.522Z
java.time에 대하여
java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 – 시간의 수업을 java.util.Date
, Calendar
, SimpleDateFormat
.
자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.
Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.
java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이 필요없고 수업이 필요 없습니다 .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로 백 포트됩니다 .
- 기계적 인조 인간
- java.time 클래스 의 최신 버전의 Android 번들 구현 .
- 이전 Android (<26)의 경우 ThreeTenABP 프로젝트 는 위에서 언급 한 ThreeTen-Backport를 채택합니다 . ThreeTenABP 사용 방법…을 참조하십시오 .
ThreeTen – 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval
, YearWeek
, YearQuarter
, 그리고 더 .
조다 타임
업데이트 : Joda-Time 현재 유지 관리 모드 인 프로젝트 는 java.time 클래스 로의 마이그레이션을 권장 합니다.
은 Using Joda 타임 자유의 선정 3 자 오픈 소스 라이브러리, 당신은 코드의 한 라인에 현재 날짜와 시간을 얻을 수 있습니다.
Joda-Time은 Java 8의 새로운 java.time. * 클래스에 영감을 주었지만 아키텍처는 다릅니다. 이전 버전의 Java에서는 Joda-Time을 사용할 수 있습니다. Joda-Time은 Java 8에서 계속 작동하며 지속적으로 관리되고 있습니다 (2014 년 기준). 그러나 Joda-Time 팀은 java.time으로의 마이그레이션을 권장합니다.
System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );
더 자세한 예제 코드 (Joda-Time 2.3)…
org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );
콘솔로 덤프…
System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );
달릴 때…
Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z
표준 시간대 작업을 수행하는 코드 예를 더 보려면 는 비슷한 질문에 대한 내 대답 을 .
시간대
JVM의 현재 기본 시간대 (임시 변경 가능)에 내재적으로 의존하지 않고 항상 시간대를 지정하는 것이 좋습니다. 이러한 의존은 날짜 시간 작업의 혼란과 버그의 일반적인 원인 인 것 같습니다.
호출 할 때 now()
할당 할 원하는 / 예상 시간대를 전달하십시오. DateTimeZone
수업을 사용하십시오 .
DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );
이 클래스는 UTC 시간대에 대한 상수를 보유합니다 .
DateTime now = DateTime.now( DateTimeZone.UTC );
JVM의 현재 기본 시간대를 실제로 사용하려면 코드가 자체 문서화되도록 명시 적으로 호출하십시오.
DateTimeZone zoneDefault = DateTimeZone.getDefault();
ISO 8601
ISO 8601 형식 에 대해 읽어보십시오 . java.time 및 Joda-Time 모두 해당 표준의 합리적인 형식을 문자열 구문 분석 및 생성에 대한 기본값으로 사용합니다.
† 실제로 java.util.Date 에는 표준 시간대 가 있으며 소스 코드 계층 아래에 묻혀 있습니다. 대부분의 실제적인 목적으로 해당 시간대는 무시됩니다. 간단히 말해서, 우리는 java.util.Date에 시간대가 없다고 말합니다. 또한, 그 매장 시간대는 Date의 방법에 의해 사용되는 시간대가 아닙니다toString
. 이 메소드는 JVM의 현재 기본 시간대를 사용합니다. 이 혼란스러운 클래스를 피하고 Joda-Time 및 java.time을 고수하는 더 많은 이유.
답변
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
//Local time zone
SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
//Time in GMT
return dateFormatLocal.parse( dateFormatGmt.format(new Date()) );
답변
이것은 확실히 UTC 시간을 String 및 Date 객체로 반환합니다!
static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static Date getUTCdatetimeAsDate() {
// note: doesn't check for null
return stringDateToDate(getUTCdatetimeAsString());
}
public static String getUTCdatetimeAsString() {
final SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
final String utcTime = sdf.format(new Date());
return utcTime;
}
public static Date stringDateToDate(String StrDate) {
Date dateToReturn = null;
SimpleDateFormat dateFormat = new SimpleDateFormat(DATEFORMAT);
try {
dateToReturn = (Date)dateFormat.parse(StrDate);
}
catch (ParseException e) {
e.printStackTrace();
}
return dateToReturn;
}
답변
Calendar c = Calendar.getInstance();
System.out.println("current: "+c.getTime());
TimeZone z = c.getTimeZone();
int offset = z.getRawOffset();
if(z.inDaylightTime(new Date())){
offset = offset + z.getDSTSavings();
}
int offsetHrs = offset / 1000 / 60 / 60;
int offsetMins = offset / 1000 / 60 % 60;
System.out.println("offset: " + offsetHrs);
System.out.println("offset: " + offsetMins);
c.add(Calendar.HOUR_OF_DAY, (-offsetHrs));
c.add(Calendar.MINUTE, (-offsetMins));
System.out.println("GMT Time: "+c.getTime());
답변
실제로 시간은 아니지만 표현이 바뀔 수 있습니다.
SimpleDateFormat f = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
f.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(f.format(new Date()));
시간은 지구 어느 곳에서나 동일하지만 시간에 대한 인식은 위치에 따라 다를 수 있습니다.
답변
캘린더 aGMTCalendar = Calendar.getInstance (TimeZone.getTimeZone ( “GMT”)); 그런 다음 aGMTCalendar 객체를 사용하여 수행 된 모든 작업은 GMT 시간대로 수행되며 일광 절약 시간제 또는 고정 오프셋이 적용되지 않습니다.
잘못된!
Calendar aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
aGMTCalendar.getTime(); //or getTimeInMillis()
과
Calendar aNotGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT-2"));aNotGMTCalendar.getTime();
같은 시간에 반환됩니다. 에 대한
new Date(); //it's not GMT.