簡體   English   中英

Java SimpleDateFormat:錯誤一小時

[英]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年提出問題時是很好的答案。今天我們不應再使用DateSimpleDateFormat ,所以我想向您展示一些現代代碼片段。 格式化(在這種情況下)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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM