将日期转换为正确的时区

时间:2018-07-25 10:12:37

标签: java time timezone date-conversion

我正在为用户抓取一些数据,其中一部分是Unix时间戳记中的日期:

enter image description here

用户居住在伦敦,希望查看其特定时区的日期。如您所见,在格林尼治标准时间是6/21,在我的时区(以色列时区)是6/22。

我使用此代码段修复:

            private SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
            txnDate = "1529618400000" //this is hardcoded, just for the example
            txnDateValue = new Date(Long.valueOf(txnDate));
            TimeZone london = TimeZone.getTimeZone("Europe/London");
            sdf2.setTimeZone(london);
            txnDate = sdf2.format(txnDateValue);

以便将日期转换为正确的时区(以伦敦为例)。

这仍然对他不起作用-他声称他看到日期相差一天。

这里可能出什么问题了?

2 个答案:

答案 0 :(得分:0)

  

这里可能出什么问题了?

  • 获取的日期和存储在txnDateValue中的日期可能读错了,时区错误或格式错误或其他任何原因
  • 在sdf2中构建和存储的DateFormat可能制造不当或使用不当,其模式或并发使用均不正确。

最重要的是,您应该设计完整的程序来测试您一方和伴侣一方的输入/输出,如果这不足以帮助您发现问题,则应该向我们展示此完整程序。

代码段没有用。我们没有问题,您有。如果我们使用您提供的代码段,则不会有任何问题。您就是遇到问题的人。因此,除了可以按原样运行的完整程序之外,什么也没有显示。

答案 1 :(得分:0)

现代版本:使用java.time

        Instant txnDateValue = Instant.ofEpochMilli(Long.parseLong(txnDate));
        ZoneId london = ZoneId.of("Europe/London");
        txnDate = txnDateValue.atZone(london).format(DateTimeFormatter.ISO_LOCAL_DATE);

上面给出了Instant的{​​{1}}(其中2018-06-21T22:00:00Z表示UTC)和Z的{​​{1}}。就像您自己的代码一样,如果其他一些线程可以操纵txnDate或涉及的其他变量,那么它也不是线程安全的。

您的代码出了什么问题?

我不知道。 Kumesana建议使用竞态条件,例如同时使用2018-06-21,这是有可能的。其他可能性是您的程序无法使用您认为的数据,或者伦敦的用户出错了。除了这些条件,我相信您的程序应产生txnDate

链接

Oracle tutorial: Date Time解释如何使用SimpleDateFormat,包括我在代码中使用的类2018-06-21java.timeInstant