将“ 2020-10-31T00:00:00Z”字符串日期转换为长整数

时间:2019-12-27 08:15:35

标签: java simpledateformat epoch

我输入的日期为 “ 2020-10-31T00:00:00Z” 。我想解析此日期以获取长毫秒。 注意:转换后的毫秒数应为悉尼时间(即GMT + 11)。

仅供参考,

public static long RegoExpiryDateFormatter(String regoExpiryDate)
    {
        long epoch = 0;

        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
        df.setTimeZone(TimeZone.getTimeZone("GMT+11"));
        Date date;
        try {
            date = df.parse(regoExpiryDate);
            epoch = date.getTime();
        } catch (ParseException e) {
            System.out.println("Exception is:" + e.getMessage());
            e.printStackTrace();
        }

        System.out.println("Converted regoExpiryDate Timestamp*************** " + epoch);
        return epoch;
    }

输出: 1604062800000 ,它使用Epoch Converter将Date设置为 2019/10/30 ,但在输入中通过31日作为日期。 有人可以澄清一下吗?

1 个答案:

答案 0 :(得分:5)

通过执行df.setTimeZone(TimeZone.getTimeZone("GMT+11"));,您正在要求日期格式化程序在GMT + 11时区中解释您的字符串。但是,不应在该时区中解释您的字符串。看到字符串中的Z吗?那代表格林尼治标准时间(GMT)时区,因此您应该这样做:

df.setTimeZone(TimeZone.getTimeZone("GMT"));

实际上,您的字符串是ISO 8601格式的Instant(或者,如果愿意,可以是“时间点”)。因此,您可以仅使用Instant.parse进行解析,并使用toEpochMilli来获取毫秒数:

System.out.println(Instant.parse("2020-10-31T00:00:00Z").toEpochMilli());
// prints 1604102400000

警告::如果Java 8 API(即SimpleDateFormat等可用),您就不再应该真正使用Instant。即使不是,也应该使用NodaTime或类似的东西。