当前位置: 首页 > 知识库问答 >
问题:

将时间从UTC转换回指定的时区

仲元凯
2023-03-14

由于对java时间的发展以及为什么会有成千上万的相关帖子感到十分困惑,我设法使用jodaTime存储了UTC时间:

Calendar cal = new GregorianCalendar();

cal.setTimeInMillis(DateTimeZone.getDefault().convertLocalToUTC(
                            cal.getTimeInMillis(), false));

因为我使用的是Hibernate(并且不愿意使用JodaTime的适配器来正确处理版本4),所以我只使用这个jodaTime方法将jdk时间转换为utc。这似乎产生了预期的结果,本地时间(当前伦敦格林尼治标准时间1)通过从本地时间减去1来转换为UTC。

目前为止,一切都好。然后,每当我检索特定时区的时间时,我都会得到不正确的偏移量 -2,它应该是 -3,包括 DST。

日历cal=新GregorianCal的();

          System.out.println("Local London Hours: "+cal.get(Calendar.HOUR_OF_DAY));
          System.out.println("Local London Milliseconds: "+cal.getTimeInMillis());

          cal.setTimeInMillis(DateTimeZone.getDefault().convertLocalToUTC(
                  cal.getTimeInMillis(), false));

          System.out.println("UTC Hours: "+cal.get(Calendar.HOUR_OF_DAY));
          System.out.println("UTC Milliseconds: "+cal.getTimeInMillis());

          // Time for specific time zone
          cal.setTimeZone(TimeZone.getTimeZone("Europe/Vilnius"));


          System.out.println("Vilnius Hours: "+cal.get(Calendar.HOUR_OF_DAY));
          System.out.println("Vilnius Milliseconds: "+cal.getTimeInMillis());

          // is this time in DST? - Yes
          System.out.println("Vilnius time is in DST: "+TimeZone.getTimeZone("Europe/Vilnius").inDaylightTime(cal.getTime()));

http://www.timeanddate.com/worldclock/city.html?n=660 特定时区的时区详细信息

输出:

伦敦当地时间:21

伦敦当地时间毫秒:1381869901339

UTC时间:20

UTC 毫秒:1381866301339

维尔纽斯 小时: 22 // 这应该是 23 (根据链接)

维尔纽斯毫秒:1381866301339

维尔纽斯时间以DST为单位:true//no,因为小时值不是23,所以不是

共有1个答案

关学
2023-03-14

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/London");

为了得到伦敦时间。

您应该能够通过以下方式将其更改为 UTC:

cal.setTimeZone(TimeZone.getTimeZone("UTC"));

但是,日历类有一个有趣的地方。在您更改时区之前和之后,如果您从中获得一些价值,它的工作效果最好。所以添加一行,

cal.get(Calendar.HOUR_OF_DAY);

这会导致日历对象重新调整其所有内部字段。

问题是,它以毫秒为单位存储时间,存储小时、日、分钟以及其他字段中的所有内容。如果您设置了小时,它不会更新毫秒时间,直到您读取某个字段。这是为了防止你要设置日期和时间等等,这样就不用每次都重新计算了,只要你把它们都改变了就行了。

类似地,如果您更改毫秒时间或时区,它不会重新计算小时和日等,直到您读取它们。

(请注意,如果您使用调试器,这将完全混淆您,因为调试器通常会调用get()中的一个来在调试控制台中显示值。这将修复日历对象,您在单步时不会遇到问题。你能看出我去过那里吗?)

所以……它会变得混乱,如果你把它放在正确的地方,上面的魔法线会让它起作用。从来没有伤害过。

注释

如果您使用JDBC将日历作为时间戳存储在数据库中,它将存储毫秒时间(或者我们可以这样认为)。

然后,当JDBC读取毫秒时间时,创建一个日历对象并将其返回给您。创建的日历中包含默认的TimeZone

像处理将伦敦时间转换为UTC一样处理这个问题。

cal.get(Calendar.HOUR_OF_DAY); // funky Calendar magic to make sure it works
cal.setTimeZone(TimeZone.getTimeZone("UTC"));

所做的就是更改存储的TimeZone,以便当get(Calendar.HOUR_OF_DAY)等下一个代码执行时,它将存储的毫秒值转换为正确的时区小时(即UTC)。

 类似资料:
  • 我有当前的毫秒utc/unix时间,现在我想将其转换为特定时区的日期时间,例如EST utc-5(纽约)。 我使用以下方法获得当前的毫秒/ unix时间: 现在我想把这个长值转换成一个特定的时区。 我如何使用 Joda time 做到这一点,因为我听说这是最好的库,但 API 对我来说似乎有点混乱。

  • 问题内容: 我有一个字符串类型就像一个计时:和是。 如何使用Java 8 datetime API将此时间信息转换为与UTC时间相对应的时间? 还需要考虑DST的东西。 问题答案: 您正在Java8 中寻找类-带有时区的完整日期时间和与UTC /格林威治标准时间的偏移量。就设计而言,此类应主要视为a 和a 的组合。的是一个至关重要的,但次要的,一条信息,用于确保所述类表示瞬间,特别是在夏令重叠。

  • 问题内容: 我有一个UTC时间(纪元Unix时间),其格式设置为时间戳,如下所示。 (人类可读的值:2017年5月31日09:57:00) 我需要将格式化为Unix时间的时间戳转换为GPS时间格式,如下所示。 (人类可读的值:2017年5月31日09:57:00) 我需要一个python程序(算法对我来说很好)将Unix时间格式的时间戳转换为GPS时间格式的时间戳。 有一个PHP程序可以这样做。我

  • 问题内容: 我正在寻找将UTC时间字符串转换为Unix时间戳的选项。 我拥有的字符串变量是,需要将其转换为unix时间戳,例如 任何想法如何做到这一点? 问题答案: 首先,unix时间戳没有时间,但以UTC为单位。 在包有功能解析与预计解析时的布局。布局是从参考时间开始构造的。因此,在您的情况下,布局应为。使用Parse之后,您将获得一个可以调用Unix来接收Unix时间戳的结构。

  • 问题内容: 我有一个UTC时区,例如: 还有一个pytz时区对象: 转换为给定时区的正确方法是什么? 问题答案: 我想我明白了: 这行代码首先将朴素的(不了解时区的) 对象转换为包含时区(UTC)的对象。然后,它使用该功能根据请求的时区调整时间。

  • 问题内容: 我需要一种简便的方法,可以在不使用任何库的情况下将日期时间戳转换为UTC(从服务器所在的任何时区)。 问题答案: 尝试getTimezone和setTimezone,请参见示例 (但这确实使用了一个类) 更新: 没有任何类,您可以尝试这样的事情: 注意:您可能还需要将时区设置回原始