SimpleDateFormat vs ZonedDateTime with timezone

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

我正在尝试将PST时间戳转换为纪元时间。

[我尝试的第一种方法是通过将America / Los Angeles作为输入时区来使用分区日期时间。

    public static void changeStringDateFormatToEpoch(String oldDate, String format) throws ParseException {
        DateTimeFormatter dtf  = DateTimeFormatter.ofPattern(format);
        LocalDateTime dt = LocalDateTime.parse(oldDate, dtf);
        ZonedDateTime zdtzone = dt.atZone(ZoneId.of("America/Los_Angeles"));
        System.out.println("When date: "+ oldDate + " is in format "+ format + " --> "  + zdtzone.toEpochSecond());
    }

此后,我尝试运行下面的代码,该代码使用SimpleDateFormat进行相同操作

 public static void changeStringDateFormatToEpochSimpleDate(String oldDate, String format) throws ParseException{
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date dt = sdf.parse(oldDate);
        long epoch = dt. getTime();
        System.out.println("When date: "+ oldDate + " is in format "+ format + " --> "  + epoch);
    }

在第二种情况下,我什至没有指定输入日期的时区,所以两个输出如何相似。

由于输入时区为PST(美国/洛杉矶),因此时间不会受到影响吗?

样本输入

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

class Scratch {
    public static void main(String[] args) {
        String date = "2019-11-27 04:32:41.000-0800"; //yyyy-MM-dd HH:mm:ss.SSSZ
        String date2 = "2019-11-27 04:32:41"; // yyyy-MM-dd HH:mm:ss


        try {
            changeStringDateFormatToEpoch(date, "yyyy-MM-dd HH:mm:ss.SSSZ");
            changeStringDateFormatToEpoch(date2, "yyyy-MM-dd HH:mm:ss");

            changeStringDateFormatToEpochSimpleDate(date, "yyyy-MM-dd HH:mm:ss.SSSZ");
            changeStringDateFormatToEpochSimpleDate(date2, "yyyy-MM-dd HH:mm:ss");


        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    public static void changeStringDateFormatToEpoch(String oldDate, String format) throws ParseException {
        DateTimeFormatter dtf  = DateTimeFormatter.ofPattern(format);
        LocalDateTime dt = LocalDateTime.parse(oldDate, dtf);
        ZonedDateTime zdtzone = dt.atZone(ZoneId.of("America/Los_Angeles"));
        System.out.println("When date: "+ oldDate + " is in format "+ format + " --> "  + zdtzone.toEpochSecond());
    }

    public static void changeStringDateFormatToEpochSimpleDate(String oldDate, String format) throws ParseException{
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date dt = sdf.parse(oldDate);
        long epoch = dt. getTime();
        System.out.println("SimpleDate : When date: "+ oldDate + " is in format "+ format + " --> "  + epoch);
    }
}

输出

When date: 2019-11-27 04:32:41.000-0800 is in format yyyy-MM-dd HH:mm:ss.SSSZ --> 1574857961
When date: 2019-11-27 04:32:41 is in format yyyy-MM-dd HH:mm:ss --> 1574857961
SimpleDate : When date: 2019-11-27 04:32:41.000-0800 is in format yyyy-MM-dd HH:mm:ss.SSSZ --> 1574857961000
SimpleDate : When date: 2019-11-27 04:32:41 is in format yyyy-MM-dd HH:mm:ss --> 1574857961000
java java-8 simpledateformat java-time
1个回答
0
投票

基于SimpleDateFormat的代码只能按预期工作,因为您是在太平洋时区的计算机上运行它。 SimpleDateFormat实例使用系统默认时区初始化,但可以更改。

要使代码健壮和可移植,请使用第一种方法。解析LocalDateTime,然后将其与显式ZoneId组合,而不是推断默认时区。

在您的示例中解析的某些日期时间使用偏移日期时间。这很有帮助;在受夏令时困扰的区域中,许多开发人员忽略了在存储本地时间戳记时是否包括当前是否实行夏令时的指示。如果没有它,则在秋季过渡到标准时间的过程中解析时间会含糊不清。

在任何情况下,您都应该意识到,也可以将LocalDateTimeZoneOffset组合以产生OffsetDateTime,并由此产生一个纪元时间。

© www.soinside.com 2019 - 2024. All rights reserved.