Java로 "unixtime"얻기


258

Date.getTime ()은 1970 년 1 월 1 일 이후 밀리 초를 반환합니다. Unixtime은 1970 년 1 월 1 일 이후 초입니다. 일반적으로 Java로 코딩하지는 않지만 몇 가지 버그 수정 작업을하고 있습니다. 나는 가지고있다:

Date now = new Date();      
Long longTime = new Long(now.getTime()/1000);
return longTime.intValue();

자바에서 유닉스 타임을 얻는 더 좋은 방법이 있습니까?


27
int로 캐스트되었으므로 2038 년 문제 (Unix의 경우 Y2K와 동일)가 도입되었습니다. 그때 유닉스 시대가 20 억을 넘어서서 마이너스로 넘어갔습니다. 해결 방법은 64 비트 Unix로 이동하는 것입니다. Java와 동등한 것은 오래 유지하는 것입니다.
John M

1
예, 알고 있습니다. 이것이 상호 작용하는 코드는 유닉스 타임에 32 비트 int를 기대하고 있습니다.
Gary Richardson

157
2038 년이 다가옵니다.
Pacerier

currentTimeMillis에 적절한 이름이나 표준이 있습니까? 필자는 문서에서 UNIX 시간의 밀리 초 버전으로 언급하는 경향이 있습니다.
Tom

1
소프트웨어가 오버플로 상태에서 살아남 으려면 long, not을 사용하십시오 int. int1 초 = 4 초와 같은 다른 세분성을 사용하지 않는 한 실제로 타임 스탬프 에 사용할 이유가 없습니다 . 코드를 숨기거나 미래 세대가 당신이 얼마나 무능한 지 알 수 없도록 코드를 숨기십시오.
bryc

답변:


475

System.currentTimeMillis ()로 Date 객체를 만들지 마십시오 . 1000으로 나누면 유닉스 시대가됩니다.

주석에서 언급했듯이 일반적으로 unixTime 변수 유형에 대해 박스형 객체 long (capital-L Long)이 아닌 기본 long (소문자 -l long)을 원합니다.

long unixTime = System.currentTimeMillis() / 1000L;

3
당신이 (컬렉션에 넣어처럼) Object로서 수를 처리하려는 경우가 아니면 또한, 원시적 사용하여 긴 대신 긴에 오토 박싱 고려, 다시 불필요한 객체 생성 방지
brabster

9
Java 32 비트 int는 32 비트 플랫폼 (2038 년 문제)과 일치합니다. 64 비트 플랫폼은 더 큰 time_t 데이터 형식을 사용합니다. Java는 System.currentTimeMillis ()의 반환 값으로 long을 사용하여 해당 글 머리 기호를 피했습니다. int로 변환하면 2038 년 문제를 다시 소개하게됩니다. en.wikipedia.org/wiki/Year_2038_problem#Solutions
John M을

1
나는 당신이 한 점에서 착각했다고 생각합니다 : 소문자 "L"과 대문자 대문자를 이와 같은 숫자 리터럴로 사용할 때 차이는 없습니다. docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1
matt forsythe

5
대문자로 된 논의 (위에서 설명)는 데이터 유형에 관한 것입니다. 기본 "long"대 "java.lang.Long"클래스 인스턴스 긴 리터럴에서 접미사 문자에 대해 이야기하고 있습니다. 대문자 또는 소문자 일 수 있습니다. 소문자 "l"은 숫자 "1"과 비슷하지만 대문자 "L"을 사용하는 것이 훨씬 더 읽기 쉽습니다.
John M

1
설명서 링크를 클릭하십시오. 리턴은 UTC 시간대에서 1/1/1970 이후 밀리 초 수로 정의됩니다. 시간대를 원하십니까? java.util.Calendar를보십시오.
John M

273

Java 8은 날짜 및 시간 작업을위한 새로운 API를 추가했습니다. Java 8을 사용하면

import java.time.Instant
...
long unixTimestamp = Instant.now().getEpochSecond();

Instant.now()현재 시스템 시간을 나타내는 Instant 를 반환합니다 . getEpochSecond()당신 과 함께 에포크 초 (유닉스 시간)를 얻습니다 Instant.


4
무엇의 차이는 Instant.now().getEpochSecond(), new Date().getTime()System.currentTimeMillis()
SohamC

2
한 가지 차이점은 전자는 몇 초이고, 후자는 두 밀리 초입니다. 다른 사람이있을 수도 있고 없을 수도 있습니다.
super_aardvark

3
import java.time.Instant당신은 스칼라에있는 경우
akauppi

4
자세한 설명은이 사이트를 확인하십시오 ... 좋아요 .. currentTimeMillis
Subroto

1
이전 Android API 레벨에서는이 방법을 사용할 수 없습니다.
알리 Nadalizadeh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.