Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将日期转换为正确的时区_Java_Time_Timezone_Date Conversion - Fatal编程技术网

Java 将日期转换为正确的时区

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

我正在为一个用户抓取一些数据,其中一部分是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);
以便将日期转换为正确的时区(以伦敦为例)

这对他来说仍然不起作用——他声称他认为日期相差一天

这里会出什么问题

这里会出什么问题

  • 获取并存储在TXN数据值中的日期可能读取错误,时区错误或格式错误或其他错误
  • sdf2中构建和存储的DateFormat可能制作得不好或使用得不好,模式不好,或者并发使用,等等
总之,您应该设计完整的程序来测试您和合作伙伴的输入/输出,如果这还不足以帮助您发现问题,您应该向我们展示完整的程序

代码片段是无用的。我们没有问题,你有。如果我们使用您提供的代码片段,就不会有问题。你才是和他们有问题的人。所以,除了一个完整的程序,我们可以按原样运行之外,没有任何意义。

现代版:使用java.time 上面给出了2018-06-21T22:00:00Z的
瞬间
(其中
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);