Java 将日期转换为正确的时区
我正在为一个用户抓取一些数据,其中一部分是Unix时间戳中的日期: 用户居住在伦敦,希望查看其特定时区的日期。正如你所看到的,格林尼治标准时间是6月21日,我的时区(以色列时区)是6月22日 我使用此代码片段修复:Java 将日期转换为正确的时区,java,time,timezone,date-conversion,Java,Time,Timezone,Date Conversion,我正在为一个用户抓取一些数据,其中一部分是Unix时间戳中的日期: 用户居住在伦敦,希望查看其特定时区的日期。正如你所看到的,格林尼治标准时间是6月21日,我的时区(以色列时区)是6月22日 我使用此代码片段修复: private SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd"); txnDate = "1529618400000" //this is hardcoded, ju
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);
以便将日期转换为正确的时区(以伦敦为例)
这对他来说仍然不起作用——他声称他认为日期相差一天
这里会出什么问题
这里会出什么问题
- 获取并存储在TXN数据值中的日期可能读取错误,时区错误或格式错误或其他错误
- sdf2中构建和存储的DateFormat可能制作得不好或使用得不好,模式不好,或者并发使用,等等
瞬间(其中Z
表示UTC)和2018-06-21的txnDate
。就像您自己的代码一样,如果其他线程可能操作txndae
或涉及的其他变量,则它不是线程安全的
你的代码出了什么问题?
我不知道。Kumesana提出了一种竞争条件,比如同时使用SimpleDataFormat
,这是一种可能性。其他可能的情况是,您的程序无法处理您认为的数据,或者您在伦敦的用户犯了错误。除了这些条件外,我相信您的程序应该产生2018-06-21
链接
解释如何使用java.time
,包括我在代码中使用的类Instant
、ZoneId
和DateTimeFormatter
。传递的txnDateValue
是哪个?如果不能,为什么不在java 8及以上版本中使用zoneDateTime
,请参阅本教程:程序运行的JVM的默认时区是什么?(您可能希望打印来自TimeZone.getDefault()
或ZoneId.systemDefault()
的输出)我无法轻松复制。当我将JVM的时区设置为Asia/telu Aviv
并运行您的代码时,我得到了2018年6月22日星期五01:00:00 IDT的TXNDevalue
和2018-06-21
的txnDate
,我知道这是您想要的。嗨,我添加了更多信息。。。也许现在情况更清楚了?如果Date
来自解析一个long并将其传递给Date(long)
构造函数,我看不出哪里出了什么问题(除了令人困惑的秒和毫秒,但我怀疑这里发生了什么)。同时使用SimpleDateFormat
是一种可能的解释。在这种情况下,误差不应总是可再现的。(我知道你的答案是在问题编辑之前发布的,所以你没有我和我们现在掌握的信息。)
Instant txnDateValue = Instant.ofEpochMilli(Long.parseLong(txnDate));
ZoneId london = ZoneId.of("Europe/London");
txnDate = txnDateValue.atZone(london).format(DateTimeFormatter.ISO_LOCAL_DATE);