我正在为用户抓取一些数据,其中一部分是Unix时间戳记中的日期:
用户居住在伦敦,希望查看其特定时区的日期。如您所见,在格林尼治标准时间是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);
以便将日期转换为正确的时区(以伦敦为例)。
这仍然对他不起作用-他声称他看到日期相差一天。
这里可能出什么问题了?
答案 0 :(得分:0)
这里可能出什么问题了?
最重要的是,您应该设计完整的程序来测试您一方和伴侣一方的输入/输出,如果这不足以帮助您发现问题,则应该向我们展示此完整程序。
代码段没有用。我们没有问题,您有。如果我们使用您提供的代码段,则不会有任何问题。您就是遇到问题的人。因此,除了可以按原样运行的完整程序之外,什么也没有显示。
答案 1 :(得分:0)
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-21
,java.time
和Instant
。