【问题标题】:How to get a Date instance with time of a day at a certain time (like 12:00:00.000) in a specific time zone?如何在特定时区的特定时间(如 12:00:00.000)获取日期实例?
【发布时间】:2020-06-27 05:05:06
【问题描述】:

例如,现在越南是 2020-03-16 11:23:23.121,但我的程序在美国运行,如何获取 2020-03-16 12:00:00.000 的 Date 实例越南,也就是说,我保持年月日不变,但是将小时设置为12,分钟,秒和纳秒设置为0,LocalDateTime可以发挥作用吗?

【问题讨论】:

  • 你能用一些输入输出清晰的例子解释一下吗?

标签: java datetime localdate


【解决方案1】:

ZonedDateTime

在 java-8 中,您可以使用 ZonedDateTime 从任何区域获取日期时间

ZonedDateTime dateTime = ZonedDateTime.now(ZoneId.of("Asia/Ho_Chi_Minh"))

您可以使用with 方法将时间修改为12:00:00。通过调用LocalTime.of 获得的LocalTime 对象传递一天中的时间。在新的LocalTime 对象中,秒和纳秒默认为零,因此无需将这些参数传递给工厂方法。

dateTime.with( LocalTime.of( 12 , 0 ) )  //2020-03-16T12:00+07:00[Asia/Ho_Chi_Minh]

Java util Date 不会存储任何时区信息,它只代表一个特定的时间瞬间(只有 UTC),精度为毫秒。我会建议避免使用旧版util.Date

【讨论】:

  • LocalDateTime可以发挥作用吗?
  • 对我来说 OP 要求并不清楚,对我来说,他似乎需要从一个区域获取日期时间并将其转换为 util.DateLocalDateTime 如果他只需要日期和时间从越南@lily
  • 现在,我想保持年、月、日不变,但将小时设置为 12,以及它下面的所有其他部分,例如越南的分、秒、纳秒为 0 一次
【解决方案2】:
ZonedDateTime zdt = ZonedDateTime.of(2020, 3, 16, 12, 0, 0, 0, ZoneId.of("Asia/Ho_Chi_Minh"));

【讨论】:

  • 微秒部分呢?
  • @lily zoneid 前的最后一个参数是纳秒。
  • 是的,我的意思是如何使小时以下的所有元素都为 0?
  • LocalDateTime可以发挥作用吗?
  • @lily 你输入了0,0,0,就像我在回答中显示的那样
【解决方案3】:

不,不要在这里使用LocalDateTime

LocalDateTime 可以发挥作用吗?

LocalDateTime 不能代表时刻,因为它缺少时区上下文或与 UTC 的偏移量。所以这正是您的问题在此处使用的 错误 类。

要表示一个时刻,时间轴上的一个特定点,请使用:

  • Instant(始终为 UTC)
  • OffsetDateTime(带有与 UTC 的偏移量,数小时-分钟-秒)
  • ZonedDateTime(带有指定的时区,以Continent/Region命名)

查看正确的Answer by Deadpool 以正确使用ZonedDateTime 来解决您的问题。

欲了解更多信息,请参阅What's the difference between Instant and LocalDateTime?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多