System.currentTimeMillis ()는 UTC 시간을 반환합니까?


93

현재 UTC 시간을 밀리 초 단위로 얻고 싶습니다. Google을 검색하고 System.currentTimeMillis ()가 UTC 시간을 반환한다는 답변을 얻었습니다. 하지만 그렇지 않습니다. 다음을 수행하는 경우 :

long t1 = System.currentTimeMillis();
long t2 = new Date().getTime();
long t3 = Calendar.getInstance().getTimeInMillis();

세 번 모두 거의 동일합니다 (호출로 인한 차이는 밀리 초).

t1 = 1372060916
t2 = 1372060917
t3 = 1372060918

이 시간은 UTC 시간이 아니라 내 시간대 시간입니다. Android에서 현재 UTC 시간을 어떻게 얻을 수 있습니까?


4
1970 년 1 월 1 일 00:00:00 UTC
Blackbelt 2013


3
long t3 = Calendar.getInstance (TimeZone.getTimeZone ( "UTC")). getTimeInMillis ();
Blackbelt

3
위의 링크는 ""컴퓨터 시간 "과 협정 세계시 (UTC) 사이에 발생할 수있는 약간의 불일치에 대한 논의는 Date 클래스 설명을 참조하십시오." java.util.Date 문서에서 "Date 클래스는 협정 세계시 (UTC)를 반영하도록 의도되었지만 Java 가상 머신의 호스트 환경에 따라 정확히 일치하지 않을 수 있습니다."-> 기계가 아닌 UTC 시간을 반환 할 수
마르코 Forberg

4
@ g.revolution : "1970 년 1 월 1 일 00:00:00 UTC 이후의 밀리 초 수"입니다. 시간대에 맞게 조정하려면 어떻게해야합니까? 현지 시간대는 해당 시대 이후 발생한 밀리 초 수에 영향을주지 않습니다.
Jon Skeet

답변:


132

표시된 세 줄 모두 현지 시간대의 영향을받지 않는 고정 된 시점 인 유닉스 시대 이후의 밀리 초 수를 제공합니다.

"이 시간은 UTC 시간이 아닙니다."라고 말합니다. 실제로 잘못 진단 한 것 같습니다. 이를 위해 epochconverter.com 을 사용하는 것이 좋습니다 . 예를 들어, 귀하의 예에서 :

1372060916 = Mon, 24 Jun 2013 08:01:56 GMT

이 값을 언제 생성했는지는 알 수 없지만 실제로 오전 8시 1 분 UTC 가 아니라면 시스템 시계에 문제가 있습니다.

어느 쪽 System.currentTimeMillis도 아니고 내에서 값 Date자체는 시간대에 따라 달라집니다. 그러나, 당신이 알고 있어야 Date.toString() 않는 A는 생각에 오도 많은 개발자를 지역 시간대, 사용 Date본질적으로 시간대와 관련된 - 그렇지 않은를, 그것은 연관된 시간대 또는 달력 시스템이없는 시간에 그냥 순간,이다.


6
따라서 기본적으로이 함수는 호스트의 시계에 관계없이 다른 시간대 내에서 동시에 호출되면 동일한 값을 반환합니다. 맞습니까?
Phillip

14
이건 세상이 단일 시간대를 채택했으면 좋겠어요. 시계의 숫자가 00:00 또는 08:00이면 크고 밝은 하늘에 떠오르면 누가 신경 쓰나요? 이 역사적인 유물에 낭비 된 수많은 시간의 생산적인 시간은 내 피를 끓게 만듭니다 ...
corsiKa

이와 관련하여 OS 클럭 함수에 대한 기본 호출에는 몇 밀리 초의 '드리프트'가 문서화되어 있습니다. 작업의 매우 정확한 기간 (작업이 시작되고 완료되는 타이밍, 델타는 경과 된 시간)을 얻기위한 의도 인 경우 Java에는 '고성능 타이머'가 있습니다. 참조 : docs.oracle.com/javase/7/docs/api/java/lang/…
Darrell Teague

@JonSkeet toString () 내부적으로 시간대를 사용하는 경우 시간대없이 어떻게 문자열을 만들 수 있습니까? 사실 저는 REST 서버에서 파일 이름이 정확히 자정 시간 값인 "1551139200.json"(2019 년 2 월 26 일 12:00:00 AM)과 같은 파일을 생성하고 있으며 장치의 System.currentTimeMillis () 후에는 Android 앱에서 액세스해야합니다. 정확한 시간을 반환합니다.
kiranking

@kiranking : Date.getTime()Unix 시대 이후의 밀리 초 시간을 찾고 1000으로 나누고 (파일 이름은 Unix 시대 이후의 초 단위 이므로) 그 정수를 문자열로 포맷하는 데 사용합니다.
Jon Skeet

3

나는 세 가지 통화가 있음을 확인할 수 있었다 신기원이 아닌 고려 현지 시간에 따라 Date.toString()또는 이와 유사한 방법을. Android 2.3을 실행하는 특정 기기에서 현지 시간에 따라 달라지는 것을 보았습니다. 다른 기기 및 Android 버전에서는 테스트하지 않았습니다. 이 경우 현지 시간은 수동으로 설정되었습니다.

독립적 인 UTC 시간을 얻는 유일한 방법은 .NET Framework를 사용하여 위치 업데이트를 요청하는 것 GPS_PROVIDER입니다. getTime()검색된 위치 의 값 NETWORK_PROVIDER도 현지 시간에 따라 다릅니다. 다른 옵션은 예를 들어 UTC 타임 스탬프를 반환하는 서버를 ping하는 것입니다.

그래서 내가하는 일은 다음과 같습니다.

public static String getUTCstring(Location location) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    String date = sdf.format(new Date(location.getTime()));
    // Append the string "UTC" to the date
    if(!date.contains("UTC")) {
        date += " UTC";
    }
    return date;
}

1
System.currentTimeMillis ()는 UTC 기반 값을 반환합니다. 운영 체제 시계의 '정확성'또는 정확성에 관해서는 확실히 결과에 영향을 미치지 만 시스템 또는 Java 환경 시간대 값과 관련이 없습니다.
Darrell Teague

@DarrellTeague 나는 특정 Huawei 장치에서 다른 값을 보았습니다. 그래서, 항상 올바른 UTC 시간 (정도의 차이를 폐기)를 반환하지 않습니다
jlhonora

OP의 질문은 Java 클래스 시간대 사용에 관한 것입니다. 이것은 하드웨어 나 반환 된 시간 값의 정확성에 관한 것이 아닙니다. 간단히 말해, JVM은 (추상적 인) 운영 "시스템 시계"(운영 체제에 따라 작동 방식에 따라 다름)에서 시간을 가져옵니다. 참조 : drdobbs.com/embedded-systems/... 운영 체제와 "C"구현 chemie.fu-berlin.de/chemnet/use/info/libc/libc_17.html
데럴 티그
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.