Thời gian kỷ nguyên Unix đến đối tượng Ngày Java


84

Tôi có một chuỗi chứa thời gian Kỷ nguyên UNIX và tôi cần chuyển đổi nó thành đối tượng Ngày Java.

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

Dòng được đánh dấu là nơi tôi đang gặp sự cố. Tôi không thể tìm ra đối số cho SimpleDateFormat () nên là gì hoặc thậm chí liệu tôi có nên sử dụng SimpleDateFormat () hay không.


Xem câu trả lời chi tiết của tôi cho một câu hỏi tương tự về cách chuyển đổi giữa mili giây thành ngày-giờ bằng mã mẫu bằng thư viện 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

Câu trả lời:


125

Làm thế nào về chỉ:

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

CHỈNH SỬA: theo câu trả lời của rde6173 và xem xét kỹ hơn đầu vào được chỉ định trong câu hỏi, "1081157732" dường như là một giá trị kỷ nguyên dựa trên giây, vì vậy bạn muốn nhân độ dài từ parseLong () với 1000 để chuyển đổi đến mili giây, đó là những gì hàm tạo Ngày của Java sử dụng, vì vậy:

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

4
Về mặt kỹ thuật, điều này sẽ không chính xác vì nó không tính đến giây nhuận sao?
Maciej Piechotka 29/10/11

1
Maciej, kỷ nguyên "dựa trên giây" của op đã tính đến giây nhuận, nó dựa trên "giây". Vì vậy, câu trả lời này là chính xác.
thecarpy

1
Nó cung cấp cho tôi các giá trị không chính xác nếu nhân với 1000, không có cách nào tốt hơn để làm điều đó?
Ishaan

1
FYI, người già lớp ngày thời gian khủng khiếp phiền hà như java.util.Date, java.util.Calendarjava.text.SimpleDateFormatbây giờ là di sản , thay thế bởi sự java.time class built vào Java 8 và sau đó. Xem Hướng dẫn của Oracle .
Basil Bourque,

Câu hỏi là kể từ thời đại, là UTC trong khi ngày dự kiến ​​tính từ GMT, chúng có giống nhau không?
Luke

37

Epoch là số giây kể từ ngày 1 tháng 1 năm 1970 ..

Vì thế:

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

Để biết thêm thông tin: http://www.epochconverter.com/


1
Đây là một điều trị ... IDK Y cái này chưa được đánh dấu là Câu trả lời :)
Makky

Cảm ơn bạn vì câu trả lời này. Tôi đang ngồi ở đây cố gắng để nhanh chóng hẹn hò từ một kỷ nguyên và kết quả là luôn luôn một ngày nào đó vào năm 1970, và đó là vì tôi đã vô tình tạo cho mili giây Java, không giây :)
Lo-Tân

24

java.time

Sử dụng java.timekhung được tích hợp trong Java 8 trở lên.

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]

Trong trường hợp này, bạn nên sử dụng tốt hơn ZonedDateTimeđể đánh dấu nó là ngày trong múi giờ UTC vì Epoch được định nghĩa theo UTC trong thời gian Unix được Java sử dụng.

ZoneOffsetchứa một hằng số hữu ích cho múi giờ UTC, như đã thấy ở dòng cuối cùng ở trên. Lớp cha của nó, ZoneIdcó thể được sử dụng để điều chỉnh thành các múi giờ khác.

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

Câu trả lời tốt. Tôi sẽ đề nghị bỏ LocalDateTimevà chỉ hiển thị a ZonedDateTime. Trong hầu hết các ứng dụng kinh doanh, đây ZonedDateTimelà cách tốt nhất. Mọi người có xu hướng gặp rắc rối / nhầm lẫn với các LocalXXXloại.
Basil Bourque

7
long timestamp = Long.parseLong(date)
Date expiry = new Date(timestamp * 1000)


0

Để chuyển đổi tem thời gian giây thành tem thời gian mili giây. Bạn có thể sử dụng API TimeUnit và gọn gàng như thế này.

long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)


-1

Hum .... nếu tôi không nhầm thì thời gian của Kỷ nguyên UNIX thực sự giống như

System.currentTimeMillis()

Vì vậy, viết

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

sẽ hoạt động (và nhanh hơn nhiều khi phân tích cú pháp ngày)


4
Thông thường thời gian kỷ nguyên Unix được đo bằng giây, không phải mili giây.
Simon Nickerson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.