자바 : 유닉스 타임 스탬프 날짜


237

유닉스 타임 스탬프를 날짜 객체로 변환해야합니다.
나는 이것을 시도했다 :

java.util.Date time = new java.util.Date(timeStamp);

타임 스탬프 값은 다음과 같습니다. 1280512800

날짜는 "2010/07/30-22:30:00"이어야합니다 (PHP에서 얻을 때) Thu Jan 15 23:11:56 IRST 1970. 대신을 얻습니다 .

어떻게해야합니까?


3
Java 8 이상을 사용하는 경우 :이 답변을 살펴보십시오. stackoverflow.com/a/24703644/1115554
micha

1
참고로, 귀찮은 된 날짜 - 시간 클래스는 다음과 같은 java.util.Date지금 기존 에 의해 대체, java.time의 클래스. Oracle의 Tutorial을 참조하십시오 .
Basil Bourque

답변:


429

의 경우 12805128001000 배가, 자바 이후의 밀리 초를 기대하고있다 :

java.util.Date time=new java.util.Date((long)timeStamp*1000);

이미 밀리 초가 있었다면 new java.util.Date((long)timeStamp);

로부터 문서 :

Date 객체를 할당하고 표준 시간 ( "epoch", 1970 년 1 월 1 일 00:00:00 GMT) 이후 지정된 밀리 초 수를 나타내도록 초기화합니다.


40
캐스트 (long)는 매우 중요합니다. 정수가 없으면 오버플로가 발생합니다.
mneri

2
@TomasK java.util.Date는 클래스의 정규화 된 이름입니다. Date이다 아마 똑같은 일이 당신이 가져 제공 java.util클래스에 패키지를.
Pablo Santa Cruz

5
길게 캐스트 할 필요는 없습니다. 시간이 새로운 java.util.Date (때문에, timeStamp * 1000L)을 (1000L 긴이기 때문에, 타임 스탬프가 긴 곱셈 이전에 업 캐스팅 될 것입니다)뿐만 아니라 단지 작동 =
토니 BenBrahim

2
내가 개인적으로 할 것 :Date time = new Date(TimeUnit.MILLISECONDS.convert(unixTimestamp, TimeUnit.SECONDS));
Ryan Amaral

3
참고로, 귀찮은 된 날짜 - 시간 클래스는 다음과 같은 java.util.Date지금 기존 에 의해 대체, java.time의 클래스. Oracle의 Tutorial을 참조하십시오 .
Basil Bourque

59

java.time

Java 8 은 날짜 및 시간 작업을위한 새로운 API 인 java.time 패키지를 도입했습니다 .

java.time을 사용하면 1970 년의 첫 번째 순간의 UTC 참조 1970-01-01T00 : 00Z 이후 전체 초 수를 구문 분석 할 수 있습니다. 결과는입니다 Instant.

Instant instant = Instant.ofEpochSecond( timeStamp );

당신이 필요로하는 경우는 java.util.Date아직 업데이트되지 예전의 코드와 상호 운용 할 수 java.time , 변환. 이전 클래스에 추가 된 새 변환 메소드를 호출하십시오.

Date date = Date.from( instant );

3
이 답변은 기술적으로 정확하지만 java.time 클래스는과 같은 오래된 날짜-시간 클래스를 대체합니다 java.util.Date. 이전 클래스는 레거시이므로 피해야합니다. 실제로 레거시 클래스와 java.time 클래스로 /에서 변환 할 수 있지만 가능할 때마다 java.time을 사용하는 것이 가장 좋습니다.
Basil Bourque


27

캘린더가 새로운 방법으로 보입니다.

Calendar mydate = Calendar.getInstance();
mydate.setTimeInMillis(timestamp*1000);
out.println(mydate.get(Calendar.DAY_OF_MONTH)+"."+mydate.get(Calendar.MONTH)+"."+mydate.get(Calendar.YEAR));

마지막 줄은 사용 방법의 예일뿐입니다. 예를 들어 "14.06.2012"가 인쇄됩니다.

System.currentTimeMillis ()를 사용하여 타임 스탬프를 저장 한 경우 "* 1000"부분이 필요하지 않습니다.

문자열에 타임 스탬프가 있으면 Long.parseLong (timestamp)와 같이 먼저 긴 구문을 구문 분석해야합니다.

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html


8
경고 : timestamp정수 (long)인 경우 먼저 캐스팅해야하며 그렇지 않으면 잘못된 날짜가 생깁니다. mydate.setTimeInMillis((long) timestamp*1000);
svenkapudija

링크를 수정했습니다.
Ricbit

참고로, 같은 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 참조하십시오 .
Basil Bourque

26

tl; dr

Instant.ofEpochSecond( 1_280_512_800L )

2010-07-30T18 : 00 : 00Z

java.time

Java 8 이상에 내장 된 새로운 java.time 프레임 워크는 Joda-Time의 후속 버전입니다.

이 새로운 클래스에는 신기원에서 초 단위의 수를 변환 하는 편리한 팩토리 메소드가 포함되어 있습니다. 당신은 얻을 Instant, 나노초 해상도까지와 UTC의 타임 라인에 잠시.

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

instant.toString () : 2010-07-30T18 : 00 : 00Z

해당 코드가 IdeOne.com에서 실시간으로 실행되는지 확인하십시오 .

최신 및 기존 Java의 날짜-시간 유형 테이블

Asia/Kabul또는 Asia/Tehran시간대?

여기에 표시된 18:00 대신 22:30의 시간 값을 얻는 것으로보고되었습니다. PHP 유틸리티가 UTC에서 조정하기 위해 기본 시간대를 암시 적으로 적용하고 있다고 생각합니다. 내 값은 UTC이며 Z(약칭 은 UTC를 의미)로 표시됩니다 Zulu. 컴퓨터의 OS 나 PHP로 설정 한 모든 기회 Asia/Kabul또는 Asia/Tehran시간대? 나는 당신 IRST이 당신의 산출물에이란 시간을 의미 한다고보고한다고 가정 합니다. 현재 2017 년 에는 UTC보다 4 시간 30 분 빠른 서머 타임으로 운영 되는 유일한 영역 입니다.

지정 적절한 시간대 이름 의 형식 continent/region예컨대, America/Montreal, Africa/Casablanca, 또는 Pacific/Auckland. 3-4 문자 약어를 사용하지 마십시오 같은 EST하거나 IST또는 IRST그들이 있습니다로 하지 진정한 시간대가 아닌 표준화, 심지어 고유하지 않은 (!).

당신이 경우 원하는 특정 지역의 시간대의 렌즈를 통해 당신의 순간을보고하는 적용 ZoneId를 얻을 ZonedDateTime. 여전히 같은 순간이지만 다른 벽시계 시간 으로 보입니다 .

ZoneId z = ZoneId.of( "Asia/Tehran" ) ;
ZonedDateTime zdt = instant.atZone( z );  // Same moment, same point on timeline, but seen as different wall-clock time.

2010-07-30T22 : 30 + 04 : 30 [아시아 / 테헤란]

java.time에서 레거시 클래스로 변환

새로운 java.time 클래스를 사용해야합니다. 그러나 필요한 경우 오래된 것으로 변환 할 수 있습니다.

java.util.Date date = java.util.Date.from( instant );

조다 타임

업데이트 : Joda-Time 프로젝트는 이제 유지 관리 모드 에 있으며 팀은 java.time 클래스 로의 마이그레이션을 조언합니다 .

참고로 Joda-Time DateTime 의 생성자 는 비슷합니다. 1000을 곱하여 long( int! 아님) 를 생성하십시오 .

DateTime dateTime = new DateTime( ( 1_280_512_800L * 1000_L ), DateTimeZone.forID( "Europe/Paris" ) );

악명 높은 번거로운 java.util.Date 및 .Calendar 클래스를 피하는 것이 가장 좋습니다. 그러나 날짜를 사용해야하는 경우 Joda-Time에서 변환 할 수 있습니다.

java.util.Date date = dateTime.toDate();

java.time에 대하여

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

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

자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.

java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이 필요없고 수업이 필요 없습니다 .java.sql.*

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

ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .


11

Date의 생성자는 timeStamp 값이 밀리 초일 것으로 예상합니다. 타임 스탬프의 값에 1000을 곱하면 생성자가 전달됩니다.


7

다른 머신에서 타임 스탬프 값을 변환하는 경우 해당 머신의 시간대도 확인해야합니다. 예를 들어;

EST 또는 UTC 시간대로 실행하는 경우 위의 선언으로 인해 다른 날짜 값이 발생합니다.

시간대를 설정하려면 일명 UTC로 간단히 재 작성할 수 있습니다.

    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));

6
이것은 구문 분석 프로세스뿐만 아니라 전체 jvm의 시간대를 설정하기 때문에 권장하지 않습니다!

1

코 틀린

fun unixToDate(timeStamp: Long) : String? {
    val time = java.util.Date(timeStamp as Long * 1000)
    val sdf = SimpleDateFormat("yyyy-MM-dd")
    return sdf.format(time)

}

0

때로는 조정 작업을해야 할 때가 있습니다.

캐스트를 오래 사용하지 마십시오! 나노 조정을 사용하십시오.

예를 들어, 거래에 Oanda Java API를 사용하면 날짜 형식을 UNIX 형식으로 얻을 수 있습니다.

예를 들면 다음과 같습니다. 1592523410.590566943

    System.out.println("instant with nano = " + Instant.ofEpochSecond(1592523410, 590566943));
    System.out.println("instant = " + Instant.ofEpochSecond(1592523410));

당신은 얻는다 :

instant with nano = 2020-06-18T23:36:50.590566943Z
instant = 2020-06-18T23:36:50Z

또한 다음을 사용하십시오.

 Date date = Date.from( Instant.ofEpochSecond(1592523410, 590566943) );

-4
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());

3
더 많은 텍스트가 없다면이 질문에 대한 다른 사람들보다 왜이 대답이 선호되는지 불분명합니다. 당신은 명확히 할 수 있습니까?
Duncan Jones

날짜를 변환하지 않고 수정합니다!
백 슬래시 N
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.