[英]Java SimpleDateFormat: an hour wrong
我不需要整個故事來澄清我的問題,所以我只是展示代碼(這只是一個例子)。 為什么我的結果有所不同?
碼
long millis = 2305293L;
System.out.println(
millis + "ms = " +
(millis / 1000) + "s = " +
(millis / 1000 / 60) + "m");
System.out.println(
new SimpleDateFormat("HH:mm:ss").
format(
new Date(millis)
)
);
產量
2305293ms = 2305s = 38m
01:38:25
如果您在倫敦或巴黎,時區是1970年1月1日GMT + 1。
出於@ARC在評論中解釋的原因,英國從1968年2月18日到1971年10月31日使用GMT + 1或UTC + 1
我可以在沒有任何時區干擾的情況下進行長時間的轉換嗎?
將TimeZone設置為GMT。
long millis = 2305293L;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(sdf.format(new Date(millis)));
版畫
00:38:25.293
試試這個 :
System.out.println(new java.util.Date (0));
你會看到它從01:00:00開始,因此相差一小時。
其他答案是正確的,並且在2013年提出問題時是很好的答案。今天我們不應再使用Date
和SimpleDateFormat
,所以我想向您展示一些現代代碼片段。 格式化(在這種情況下)2 305 293毫秒的正確方法取決於它們代表什么。 我將針對三種不同情況提出三種選擇。
您需要決定在哪個時區解釋您的時間點。 例如:
long millis = 2_305_293L;
DateTimeFormatter formatter = DateTimeFormatter
.ofLocalizedDateTime(FormatStyle.LONG)
.withLocale(Locale.ENGLISH);
ZonedDateTime dateTime = Instant.ofEpochMilli(millis)
.atZone(ZoneId.of("America/Coral_Harbour"));
String formattedTime = dateTime.format(formatter);
System.out.println(formattedTime);
1969年12月31日美國東部時間下午7:38:25
由於在時代珊瑚港處於UTC偏移-05:00,我們得到的時間接近1969年底。如果你想要UTC的時間(因為時期是用UTC定義的;換句話說,如果你想要00:38:25
),它有點不同:
DateTimeFormatter formatter = DateTimeFormatter
.ofLocalizedDateTime(FormatStyle.MEDIUM)
.withLocale(Locale.ENGLISH);
OffsetDateTime dateTime = Instant.ofEpochMilli(millis)
.atOffset(ZoneOffset.UTC);
1970年1月1日,上午12:38:25
除了時區,您還可以通過區域設置和格式長度(格式,長,中,短)改變語言。 如果您想要沒有日期的時間,請使用ofLocalizedTime
而不是ofLocalizedDateTime
。
假設你的毫秒是從0:00(“午夜”)以來的任何時區:
LocalTime time = LocalTime.MIN.with(ChronoField.MILLI_OF_DAY, millis);
System.out.println(time);
00:38:25.293
如果此格式令人滿意,則不需要任何顯式格式化程序。 如果沒有,您可以使用DateTimeFormatter
。
一段時間與時間完全不同,並作為Duration
對象處理。 沒有直接支持格式化它,但是從Java 9開始就不那么難了(當你知道如何)時:
Duration amountOfTime = Duration.ofMillis(millis);
String formattedTime = String.format("%02d:%02d:%02d",amountOfTime.toHours(),
amountOfTime.toMinutesPart(), amountOfTime.toSecondsPart());
System.out.println(formattedTime);
0時38分25秒
Oracle教程:Date Time解釋如何使用java.time。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.