繁体   English   中英

将时区从字符串转换为 UTC (JODA TIME)

[英]Converting Time Zones from a String to UTC (JODA TIME)

我在数据库中有一个存储的 UTC 时间戳。 当我检索该 UTC 时间戳时,我将其转换为字符串。 我想获取该 UTC 时间戳字符串并使用 Joda 时间将其转换为设备的本地时间。 任何可以帮助解决这个问题的人。 将不胜感激! 这是我现在正在做的事情:

                String date = ""+ds.child("datecreated").getValue();

                DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

                DateTime dt = formatter.parseDateTime(date);

                DateTime dt2 = new DateTime(dt).toDateTime(DateTimeZone.getDefault());

                String personalDate = dt2.toString();

                dateTV.setText(personalDate);

                System.out.println("THIS IS THE FIRST TIME: " + dt + "THIS IS THE SECOND TIME: " + dt2); 

问题是,当我将其转换为本地时间时,它给了我完全相同的时间,它不应该这样做,因为它存储在 UTC 中,而我正在转换为东部标准时间,这是我手机的默认时间。

您缺少的部分是,正如 JavaDoc 所述,DateTime 对象在内部由“从 1970-01-01T00:00:00Z 的 Java 纪元开始的毫秒数”表示。

因此,DateTime 没有时区。 表示同一时刻的两个 DateTime 对象完全相同,无论您从中解析它的字符串中表示的时区如何。

格式化 DateTime 时,它​​仅“具有”时区。 当您格式化它时,您会得到一个带有您请求的时区的字符串,并相应地调整时间表示。

两个日期(dt 和 d2)在您看来相同的原因是因为您没有对它们进行格式化(您使用了它们的隐式“toString()”方法),因此都使用您的本地时区进行了格式化。

为了表明评论中的 Andreas 恰到好处:我在 America/Coral_Harbour 时区运行了以下代码段(因为我不知道您的确切时区,东部标准时间用于几个(尽管 3 月 8 日之后较少)当东部夏令时开始时))。

    String date = "2020-03-12T01:23:45.678+0000";

    System.out.println("This is the string:      " + date); 

    DateTime dt = new DateTime(date);
    DateTime dt2 = new DateTime(dt).toDateTime(DateTimeZone.getDefault());

    System.out.println("This is the first time:  " + dt); 
    System.out.println("This is the second time: " + dt2); 

输出是:

 This is the string: 2020-03-12T01:23:45.678+0000 This is the first time: 2020-03-11T20:23:45.678-05:00 This is the second time: 2020-03-11T20:23:45.678-05:00

比较前两行,注意在解析字符串时已经发生了从 UTC 到 EST 的转换。

顺便说一句,由于您的字符串采用 ISO 8601 格式,因此您无需指定任何格式化程序来解析它。 DateTime(Object)构造函数接受它。 但是在您的解析中发生了相同的转换。

你的代码发生了什么?

重复安德烈亚斯评论中的引用:

如果withOffsetParsed()已被调用,则生成的 DateTime 将具有基于解析时区的固定偏移量。 否则生成的 DateTime 将具有此格式化程序的区域,但解析的区域可能导致时间调整。

所以你的格式化程序有你设备的默认时区,因此还有你从解析中得到的DateTime对象。

因此,在创建dt2您正在从东部标准时间转换为东部标准时间,因此再次获得相同的日期时间。

链接: DateTimeFormatter.parseDateTime()文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM