gpt4 book ai didi

java - 如何在 Java 中转换 UTC 和本地时区

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:03:57 24 4
gpt4 key购买 nike

我对 Java 中的时区很好奇。我想从设备获取以毫秒为单位的 UTC 时间并发送到服务器。服务器在向用户显示时间时会将其转换为本地时区。我系统的时区是Australia/Sydney(UTC+11:00),测试时区结果如下:

int year = 2014;
int month = 0;
int date = 14;
int hourOfDay = 11;
int minute = 12;
int second = 0;
Calendar c1 = Calendar.getInstance();
c1.set(year, month, date, hourOfDay, minute, second);

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss z");
System.out.println(sdf.format(c1.getTime()));

Calendar c2 = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
c2.set(year, month, date, hourOfDay, minute, second);
System.out.println(sdf.format(c2.getTime()));

输出:

14/01/2014 11:12:00 EST
14/01/2014 22:12:00 EST

我以为 c2 可以是 13/01/2014 00:12:00,因为 UTC 时间比我的时间晚 11 小时。日历是否按我预期的方式工作?

我们将不胜感激。

编辑

添加了 z 来显示时区。这让我更加困惑,因为 Mac 说它的时区是 (AEDT) 澳大利亚东部夏令时,但 Java 是 EST。无论如何,结果仍然不同,因为 EST 是 UTC-5 小时。

最佳答案

更新:此答案现已过时。 Joda-Time 库现在已被 Java 8 及更高版本中内置的 java.time 框架所取代。参见 this new Answer .

三字母代码

您应该避免使用 3 或 4 个字母的时区代码,例如 ESTIST。它们既不是标准的也不是唯一的。

使用proper time zone names ,主要是 Continent/CityOrRegion,例如 America/MontrealAsia/Kolkata

乔达时间

java.util.Date/Calendar 类是出了名的糟糕。避免使用它们。使用 Joda-Time或者,在 Java 8 中,新的 java.time.* classes由 JSR 310 定义并受 Joda-Time 启发。

注意下面显示的 Joda-Time 代码是多么简单和明显。 Joda-Time 甚至知道如何计数——一月是 1,而不是 0!

时区

在 Joda-Time 中,一个 DateTime实例知道自己的时区。

Sydney Australia标准时间比 UTC/GMT 提前 10 小时,夏令时 (DST) 提前 11 小时。 DST 适用于问题指定的日期。

提示:不要这样想......

UTC time is 11 hours later than mine

这样想……

Sydney DST is 11 hours ahead of UTC/GMT.

如果您在 UTC/GMT 中思考、工作和存储,日期时间工作将变得更容易且更不容易出错。仅转换为本地化日期时间以在用户界面中显示。全局思考,本地展示。您的用户和服务器可以轻松移动到其他时区,所以忘掉您自己的时区吧。始终指定时区,切勿假设或依赖默认值。

示例代码

这是一些使用 Joda-Time 2.3 和 Java 8 的示例代码。

// Better to specify a time zone explicitly than rely on default.
// Use time zone names, not 3-letter codes.
// This list is not quite up-to-date (read page for details): http://joda-time.sourceforge.net/timezones.html
DateTimeZone timeZone = DateTimeZone.forID("Australia/Sydney");
DateTime dateTime = new DateTime(2014, 1, 14, 11, 12, 0, timeZone);
DateTime dateTimeUtc = dateTime.toDateTime(DateTimeZone.UTC); // Built-in constant for UTC (no time zone offset).

转储到控制台...

System.out.println("dateTime: " + dateTime);
System.out.println("dateTimeUtc: " + dateTimeUtc);

运行时...

dateTime: 2014-01-14T11:12:00.000+11:00
dateTime in UTC: 2014-01-14T00:12:00.000Z

关于java - 如何在 Java 中转换 UTC 和本地时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21082325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com