Unix epoch time to Java Date object


85

ฉันมีสตริงที่มีเวลาUNIX Epochและฉันต้องการแปลงเป็นวัตถุ Java Date

String date = "1081157732";
DateFormat df = new SimpleDateFormat(""); // This line
try {
  Date expiry = df.parse(date);
 } catch (ParseException ex) {
  ex.getStackTrace();
}

เส้นที่ทำเครื่องหมายคือจุดที่ฉันมีปัญหา ฉันไม่สามารถสรุปได้ว่าอาร์กิวเมนต์ของ SimpleDateFormat () ควรเป็นอย่างไรหรือแม้ว่าฉันควรจะใช้ SimpleDateFormat ()


ดูคำตอบโดยละเอียดของฉันสำหรับคำถามที่คล้ายกันเกี่ยวกับการแปลงระหว่างมิลลิวินาทีเป็นวันเวลาด้วยโค้ดตัวอย่างโดยใช้ไลบรารี Joda-Time
Basil Bourque

private String getDateString(long timeInMilliseconds) { SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy 'at' HH:mm:ss z"); return formatter.format(timeInMilliseconds); }
JVJplus

คำตอบ:


129

แล้วแค่:

Date expiry = new Date(Long.parseLong(date));

แก้ไข: ตามคำตอบของrde6173และเมื่อพิจารณาอย่างละเอียดยิ่งขึ้นที่อินพุตที่ระบุในคำถาม "1081157732" ดูเหมือนจะเป็นค่าช่วงเวลาที่อิงตามวินาทีดังนั้นคุณจึงต้องการคูณ long จาก parseLong () ด้วย 1,000 เพื่อแปลง เป็นมิลลิวินาทีซึ่งเป็นสิ่งที่ตัวสร้าง Date ของ Java ใช้ดังนั้น:

Date expiry = new Date(Long.parseLong(date) * 1000);

4
สิ่งนี้จะไม่ผิดในทางเทคนิคเนื่องจากไม่ได้คำนึงถึงวินาทีอธิกสุรทิน
Maciej Piechotka

1
Maciej ซึ่งเป็นยุค "วินาทีตาม" ของ op แล้วคิดเป็นวินาทีอธิกสุรทินคือ "วินาที" - ตาม ดังนั้นคำตอบนี้ถูกต้อง
thecarpy

1
มันให้ค่าที่ไม่ถูกต้องถ้าคูณด้วย 1000 ไม่มีวิธีที่ดีกว่านี้หรือ?
Ishaan

1
FYI, ลำบากชะมัดเก่าชั้นเรียนวันที่เวลาเช่นjava.util.Date, java.util.Calendarและjava.text.SimpleDateFormatตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียนที่สร้างขึ้นใน Java 8 และต่อมา ดูการสอนโดยออราเคิล
Basil Bourque

คำถามคือตั้งแต่ยุคซึ่งเป็น UTC ในขณะที่วันที่คาดว่าระยะยาวจะมาจาก GMT พวกเขาเหมือนกันหรือไม่?
ลุค

37

Epoch คือจำนวนวินาทีนับตั้งแต่วันที่ 1 มกราคม 1970 ..

ดังนั้น:

String epochString = "1081157732";
long epoch = Long.parseLong( epochString );
Date expiry = new Date( epoch * 1000 );

สำหรับข้อมูลเพิ่มเติม: http://www.epochconverter.com/


1
นี่ใช้งานได้ ... IDK Y นี้ยังไม่ได้รับการตรวจสอบเป็นคำตอบ :)
Makky

ขอบคุณสำหรับคำตอบนี้ ฉันนั่งอยู่ที่นี่เพื่อพยายามสร้างอินสแตนซ์วันที่จากยุคหนึ่งและผลลัพธ์ก็คือวันหนึ่งในปี 1970 เสมอและเป็นเพราะฉันให้ Java มิลลิวินาทีโดยไม่รู้ตัวไม่ใช่วินาที :)
Lo-Tan

24

java.time

ใช้java.timeเฟรมเวิร์กที่สร้างใน Java 8 และใหม่กว่า

import java.time.LocalDateTime;
import java.time.Instant;
import java.time.ZoneId;

long epoch = Long.parseLong("1081157732");
Instant instant = Instant.ofEpochSecond(epoch);
ZonedDateTime.ofInstant(instant, ZoneOffset.UTC); # ZonedDateTime = 2004-04-05T09:35:32Z[UTC]

ในกรณีนี้คุณควรใช้ZonedDateTimeเพื่อทำเครื่องหมายเป็นวันที่ในเขตเวลาUTCเนื่องจาก Epoch ถูกกำหนดเป็น UTC ในเวลา Unix ที่ Java ใช้

ZoneOffsetมีค่าคงที่ที่มีประโยชน์สำหรับเขตเวลา UTC ดังที่เห็นในบรรทัดสุดท้ายด้านบน ซุปเปอร์คลาสZoneIdสามารถใช้เพื่อปรับเปลี่ยนเป็นโซนเวลาอื่นได้

ZoneId zoneId = ZoneId.of( "America/Montreal" );

คำตอบที่ดี. ฉันขอแนะนำให้วางLocalDateTimeและแสดงไฟล์ZonedDateTime. ในแอปธุรกิจส่วนใหญ่ZonedDateTimeเป็นวิธีที่ดีที่สุด ผู้คนมักจะมีปัญหา / สับสนกับLocalXXXประเภทต่างๆ
Basil Bourque


0

ยังดีกว่าใช้JodaTime ง่ายกว่ามากในการแยกวิเคราะห์สตริงและเป็นสตริง เธรดปลอดภัยเช่นกัน คุ้มค่ากับเวลาที่คุณจะนำไปใช้


FYI ตอนนี้โปรเจ็กต์Joda-Timeอยู่ในโหมดการบำรุงรักษาโดยทีมงานจะแนะนำการย้ายข้อมูลไปยังคลาสjava.time ดูการสอนโดยออราเคิล
Basil Bourque

0

ในการแปลงการประทับเวลาวินาทีเป็นการประทับเวลามิลลิวินาที คุณสามารถใช้ TimeUnit API และเรียบร้อยเช่นนี้

long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)


-1

ฮึ่ม .... ถ้าผมจำไม่ผิดเวลาของ UNIX Epoch ก็เหมือนกับ

System.currentTimeMillis()

ดังนั้นการเขียน

try {
    Date expiry = new Date(Long.parseLong(date));
}
catch(NumberFormatException e) {
    // ...
}

ควรใช้งานได้ (และเร็วกว่ามากในการแยกวิเคราะห์วันนั้น)


4
โดยปกติแล้วเวลาของ Unix epoch จะวัดเป็นวินาทีไม่ใช่มิลลิวินาที
Simon Nickerson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.