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

我对 Java 中的时区很好奇.我想从设备获取 UTC 时间(以毫秒为单位)并发送到服务器.服务器在向用户显示时间时会将其转换为本地时区.我系统中的时区是澳大利亚/悉尼(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,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 小时.

YOZA007 回答:如何在 Java 中转换 UTC 和本地时区

您可能打算在格式化程序上设置时区,而不是日历(或者除了日历,还不是 100% 清楚您要完成什么)!用于创建人类表示的时区来自 SimpleDateFormat.当您通过调用 getTime() 将其转换回 java.util.Date 时,日历中的所有时区"信息都会丢失.

代码:

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 10:12:00,因为 Syndey(格式化程序的时区)中显示的 11AM UTC 是晚上 10 点!(使用 HH 格式表示 24 小时时间)

这会打印出你想要做的事情:

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

sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(sdf.format(c1.getTime()));

UTC 毫秒"的概念毫无意义.毫秒数只是历史上的一个固定点,它没有与之关联的时区.我们向其添加时区以将其转换为人类可读的表示形式.

是的,对于(美国)东部时间和(澳大利亚)东部时间都使用EST"的歧义一直是 Java 中的一个陷阱.

这篇关于如何在 Java 中转换 UTC 和本地时区的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持前端之家!

本文链接:https://www.f2er.com/3175507.html

大家都在问