gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:00:13 24 4
gpt4 key购买 nike

完全搞不清 Java 时间的情况以及为什么有数千篇与此相关的帖子,我设法使用 jodaTime 以 UTC 形式存储时间:

Calendar cal = new GregorianCalendar();

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

由于我正在使用 hibernate(并且不愿意使用 JodaTime 适配器来与版本 4 一起正常工作),所以我只使用此 jodaTime 方法将 jdk 时间转换为 utc。这似乎产生了预期的结果,并且本地时间(当前伦敦 GMT+1)通过从本地时间减去 1 转换为 UTC。

到目前为止一切顺利。然后,每当我检索特定时区的时间时,我都会得到错误的 -2 偏移量,而它应该是 -3(包括夏令时)。

Calendar cal = new GregorianCalendar();

          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

世界标准时间:20

UTC 毫秒:1381866301339

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

维尔纽斯毫秒:1381866301339

维尔纽斯时间采用 DST:true//不,不是,因为小时值不是 23

最佳答案

使用

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

获取伦敦时间。

您应该能够将其更改为 UTC:

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

但是,Calendar 类有一个有趣的事情。在更改时区之前和之后,如果您从中获得一些值(value),效果最好。因此添加一行,例如,

cal.get(Calendar.HOUR_OF_DAY);

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

问题在于它以毫秒为单位存储时间,并在其他字段中存储小时、日期和分钟以及所有这些。如果您设置小时,它不会更新毫秒时间,直到您读取某些字段。以防万一您要设置日期、时间和所有内容,这样就不必每次都重新计算,只需在您将它们全部更改后即可。

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

(请注意,如果您使用调试器,这会让您完全感到困惑,因为调试器通常会调用 get() 之一来在调试控制台中显示值。这将修复 Calendar 对象,单步执行时就不会出现问题。你能看出我去过那里吗?)

所以......它可能会变得困惑,如果你把它放在足够多的正确位置,上面的魔法线就会让它发挥作用。而且它永远不会伤害。

注意

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

然后,当 JDBC 读取毫秒时间时,创建一个 Calendar 对象并将其返回给您。创建的Calendar 中有默认的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)。

关于java - 将时间从 UTC 转换回指定的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19390748/

24 4 0