我可以从不同区域的LocalDateTime获取正确的日期时间吗?

问题描述

我使用 LocalDateTime.Now()将当前日期时间保存在数据库中,我看到它保存为键值的Map,在地图上我看到了时间,月份,年份,秒,纳米的键 - 等等。但我看不到任何有关区域的信息。那么,如果在不同区域中检索相同时间的日期说美国(从印度保存的数据),那么该怎么办呢?

解决方法

LocalDateTime不受地区或时区限制

引用extensive description of java.time,查看有关LocalDateTime的900多个投票答案:

它们不依赖于任何一个地区或时区。它们不受时间限制。除非您将其应用于某个地方以在时间轴上找到一个点,否则它们没有真正的意义。

extensive description of java.time引出更多关于Java时间类型用法的信息:

因此,对于商务应用程序,“本地”类型不常用,因为它们仅表示可能的日期或时间的一般概念,而不是时间轴上的特定时刻。商业应用程序倾向于关心发票到达的确切时间,运送产品的运输,雇用员工或出租车离开车库的确切时间。因此,业务应用程序开发人员最常使用Instant和ZonedDateTime类。

下面是一个示例,其中使用一种推荐类型来指定时区“ America / Los_Angeles”:

ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));

这是另一种做同样的事情:

ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(Instant.now(),ZoneId.of("America/Los_Angeles"));

另一种做相同事情的变体:

ZonedDateTime zonedDateTime = ZonedDateTime.now().withZoneSameInstant(ZoneId.of("America/Los_Angeles"));

您可以使用 ZoneId.getAvailableZoneIds()查看可用区域ID:

ZoneId.getAvailableZoneIds().stream().forEach(System.out::println);

通过以下网址了解有关java.time的更多信息:

extensive description of java.time,请查看900多个投票的答案。

您可以在此处阅读有关ZonId和ZoneOffset的更多信息: https://docs.oracle.com/javase/10/docs/api/java/time/ZoneId.html https://docs.oracle.com/javase/10/docs/api/java/time/ZoneOffset.html

,

overview of modern date-time classes in Java所示,具有时区信息的类是ZonedDateTimeOffsetDateTimeOffsetTime等。类LocalDateTime可以没有时区信息。

enter image description here

here所述,

处理日期和时间(没有时区)的类是 LocalDateTime,Date-Time API的核心类之一。这个 类用于表示日期(月-日-年)和时间 (时分秒纳秒),实际上是 LocalDateLocalTime。此类可用于表示 具体活动,例如路易威登杯首场比赛 美洲杯挑战者系列赛决赛,比赛始于1:10 下午请注意,这表示2013年8月17日下午1点10分。在当地时间。 要包括时区,您必须使用ZonedDateTimeOffsetDateTime,如Time Zone and Offset Classes中所述。

以下是使用OffsetDateTime的示例代码:

OffsetDateTime odt = OffsetDateTime.now(ZoneOffset.UTC);// Change ZoneOffset as applicable
PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
st.setObject(1,odt);
st.executeUpdate(); 
st.close();

通过 Trail: Date Time 了解有关现代日期时间API的更多信息。

,
Date date = new Date();
ZonedDateTime zonedDateTime = date.toInstant().atZone(ZoneId.of("US/Eastern"));

有不同的时区,根据它们的值,您可以拥有日期时间。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...