在Java中,我如何将时间间隔从秒转换为格林尼治标准时间1970年1月1日00:00:00 [毫秒] [毫秒

问题描述 投票:2回答:1

简而言之:

我有一个纪元,我想把它定为时间,因为January 1, 1970, 00:00:00 GMTjava.util.Date一样会给定。

此代码有助于演示我的问题:

import java.util.Date;
import java.util.Locale;

import org.junit.Test;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class TimeHelp {

    private String format = "EEE MMM dd HH:mm:ss yyyy";

    public SimpleDateFormat asSimpleDateFormat() {
        return new SimpleDateFormat(format, Locale.ENGLISH);
    }

    public DateTimeFormatter asDateTimeFormatter() {
        return DateTimeFormatter.ofPattern(format, Locale.ENGLISH);
    }

    @Test
    public void test() throws Exception {
        System.out.println(ZoneId.systemDefault());
        String s = "Sun Apr 04 02:00:01 2010";
        long t1 = asSimpleDateFormat().parse(s).getTime();

        ZonedDateTime zoned = LocalDateTime.parse(s, asDateTimeFormatter())
                    .atZone(ZoneId.systemDefault());
        long t2 = zoned.toEpochSecond() * 1000;

        long t3 = Date.from(zoned.toInstant()).getTime();

        long t4 = zoned.toInstant().toEpochMilli();

        System.out.println("t1 " + t1);
        System.out.println("t2 " + t2);
        System.out.println("t3 " + t3);
        System.out.println("t4 " + t4);
        System.out.println("Difference in minutes " + Math.abs(t1 - t2)/1000/60);
    } 
}

然后输出:

Australia/Sydney
t1 1270310401000
t2 1270306801000
t3 1270306801000
t4 1270306801000
Difference in minutes 60

请注意,t1与所有其他都不相同,我认为是因为t1是格林尼治标准时间,而其他都是UTC。

如果使用SimpleDateFormat,则long的值与如果使用DateTimeFormatter获得ZonedDateTime,然后调用toEpochSecond()的值不同。

出于某些原因,我想获得一个ZonedDateTime,但我想将其转换为Date,但由于Date在GMT而不是UTC中起作用,所以看起来这样的事情不起作用。

java datetime java-time datetime-parsing
1个回答
1
投票

引用timeanddate.com

当当地夏令时即将到达Sunday, April 4, 2010, 3:00:00 am时,时钟会向后调1小时至Sunday, April 4, 2010, 2:00:00 am当地标准时间。

这意味着Sun Apr 04 02:00:01 2010在当天发生[[两次。那么,您会从那2个中得到哪一个?

使用SimpleDateFormat,您会得到

稍后,尽管未记录。

使用ZonedDateTime,您将获得

早期

对于重叠,通常的策略是,如果本地日期时间落在重叠的中间,则将保留以前的偏移量。如果没有先前的偏移量,或者先前的偏移量无效,则使用较早的偏移量,通常为“夏令时”。ZonedDateTimewithEarlierOffsetAtOverlap()这两种其他方法可帮助管理重叠情况。
© www.soinside.com 2019 - 2024. All rights reserved.