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

我想使用java 8日期时间API从亚洲/加尔各答时间计算亚洲/迪拜时区的时间

李光华
2023-03-14
 ZoneId dubai = ZoneId.of("Asia/Dubai");
 LocalDate localDate = LocalDate.now();
 LocalTime localTime = LocalTime.now();
 ZonedDateTime zonedDateTime = ZonedDateTime.of(localDate, localTime, dubai);
System.out.println("Dubai Tiime:"+zonedDateTime);

以上代码仍在打印我当前所在区域(即亚洲/加尔各答)的时间

此外,我还尝试了以下代码以实现相同的效果,但这也是我当前所在区域(亚洲/加尔各答)的打印时间:

ZoneOffset offset = ZoneOffset.of("+04:00");
LocalDateTime localDateTime = LocalDateTime.now();
OffsetDateTime plusFour = OffsetDateTime.of(localDateTime, offset);
System.out.println("Dubai Time :"+plusFour);

我不明白为什么它不能提供预期的结果。

共有2个答案

华子航
2023-03-14

问题是您用本地日期和时间实例化了ZoneDateTime。

这将做你想要的:

ZonedDateTime dubaiDT = Instant.now().atZone(dubaiZone);
龚博涛
2023-03-14

科科林的回答是正确的。这里有更多的讨论。

调用now方法且未传递任何参数时,无法指定时区。在这个省略中,java。时间无声地应用JVM的当前默认时区来确定当前本地时间和当前本地日期。

您声称JVM当前的默认时区是亚洲/加尔各答(印度时间)。如果您运行该代码时,办公室的时间是15:30,那么您的代码会说“让我们以我的15:30作为输入,表示迪拜的挂钟时间”。因此,虽然迪拜的当前时刻实际上是14:00(我想比印度更接近UTC一个半小时),但您为迪拜未来的一个半小时创建了一个日期时间:15:30。

当您在ZonedDateTime中通过迪拜时。of(localDate,localTime,dubai)您假设您要求在时区之间进行调整。但事实上,您将时区指定给一个完全没有时区的简单(“本地”)日期和时间。所有三个本地类在内部都不存储时区;他们的目的就是忽视时区。您的代码与您的意图不匹配。

请注意,在这次代码修订中,我是如何将ZoneId对象传递给这两个方法的。这会解决你的问题。

    ZoneId dubai = ZoneId.of ( "Asia/Dubai" );
    LocalDate localDate = LocalDate.now ( dubai );  
    LocalTime localTime = LocalTime.now ( dubai ); // Capturing `14:00` in Dubai rather than than `15:30` in India as in your version of code.
    ZonedDateTime zonedDateTime = ZonedDateTime.of ( localDate , localTime , dubai );
    System.out.println ( "Dubai Tiime:" + zonedDateTime );

但这仍然是错误的代码。如果这对<代码>。现在,方法在午夜被调用,你会得到非常错误的信息(大约24小时关闭)。

相反,您应该以原子的方式捕捉当前时刻。要么使用Kokorin的代码,要么使用下面显示的我的代码。

瞬间是UTC时间线上分辨率为纳秒的时刻。

Instant instant = Instant.now();
ZoneId zoneId_Dubai = ZoneId.of( "Asia/Dubai" );
ZonedDateTime zdt_Dubai = ZonedDateTime.ofInstant( instant , zoneId_Dubai );

作为快捷方式,调用静态方法ZonedDateTime。现在。

ZonedDateTime zdt_Dubai = ZonedDateTime.now( zoneId_Dubai );

要看到相同的时刻,但用你自己的挂钟时间,调整到印度时间。

ZonedDateTime zdt_Kolkata = zdt_Dubai.withZoneSameInstant( ZoneId.of( "Asia/Kolkata" ) );

重要提示:始终传递可选时区参数。虽然我非常尊重进入java的工作。时间,我认为在各种方法上选择时区参数是一个设计缺陷。JVM当前默认时区的无声隐式应用程序对于这么多程序员来说太容易落入陷阱。顺便说一下,对于语言环境,请始终指定。

另一个提示:用UTC思考、工作和存储。作为一名程序员,你必须学会用UTC思考,把你的头从“我在加尔各答的时间”和“他们在迪拜的时间”中拿出来。你会让自己发疯,让你的大脑受伤。在编程时,要知道唯一真正的时间是UTC。所有其他迪拜/加尔各答/蒙特利尔/奥克兰时间都是烟雾和镜子,仅仅是幻觉。在您的大部分代码中使用Instant类,在进行日期时间工作时使其成为您的“go to”类(仅应用时区显示给用户)。在您的数据库中使用UTC。在UTC中登录。将您的服务器保持在UTC(或冰岛)时区。在将日期时间值序列化到存储或数据交换时使用UTC(顺便说一句,使用ISO 8601格式)。在办公桌或屏幕上保留一个时钟,显示UTC。稍后,当你下班回家时,你可以回到你自己的本地“印度时间”思维。

 类似资料:
  • 我写了一个代码来获取迪拜当前时间。但我正在获取系统当前时间作为回报 下面是我一直在使用的代码 加利福尼亚州。getTime()始终返回系统时间。 我目前在印度。所以这个日历实例总是返回印度时间。 如何获取迪拜当前时间

  • 我需要一些解释为什么这个代码不编译: 错误: 类型Duration中的(TemporalAmount)方法不适用于参数(ChronoUnit) 正如本文所述: public static Duration from(TemporalAmount amount)从时间量中获取持续时间的实例。这将根据指定的金额获得持续时间。TemporalAmount表示一个时间量,可以是基于日期的,也可以是基于时间

  • 问题内容: 我正在尝试获取特定时区的当前时间。我尝试了以下代码。 我得到的答案令人惊讶-16:57-错了1个小时tz.getRawOffset()-7000 3600000是-为什么亚利桑那州的夏令时是正确的?如何获得凤凰城或美国任何其他城市的正确挂钟时间? 问题答案: 亚利桑那州处于山区时区,但未遵守DST。如果您将时区指定为“ US / Mountain”,则计算机将应用Mountain时区中

  • 何时何地哪个更可取? 我不知道他们之间到底有什么区别。 来自LocalDateTime的文档 ...时间表示为纳秒精度。例如,值“2007 年 10 月 2 日 13:45.30.123456789”可以存储在 LocalDateTime 中。 我假设LocalDateTime也可以接受纳秒。所以我想,我可以用LocalDateTime替换我的代码,它们被声明为TimeStamp。如果我错了,请纠

  • 也许有人能给我举个例子?我在问自己,新的日期和时间API的改进来自哪里。

  • 问题内容: 我有一个脚本,需要在脚本的不同行执行以下命令: 在我的陈述中,我有以下内容: 我收到以下错误: 如果我将语句的顺序更改为: 我收到以下错误: 如果我再次将语句更改为: 我收到以下错误: 这是怎么回事,我怎么都可以工作? 问题答案: 您的麻烦是,您有一些代码希望对 模块 进行引用,而其他代码希望对类进行引用 。 显然,不能两者兼有。 当您这样做时: 您首先要设置为对该类的引用,然后立即将