我想在Java中构造不带时区的日期。我已经尝试过忽略时区:
Calendar time = Calendar.getInstance();
time.clear(Calendar.ZONE_OFFSET);
System.out.println("time = " + time.getTime());
但这对我不起作用。它返回“ 2018-07- 11 03 :00:00”,而不是“ 2018-07- 10 15 :00:00”。
请提出任何想法。
答案 0 :(得分:2)
LocalDateTime.now(
ZoneId.of( "America/Montreal" )
)
.toString()
2018-01-23T12:34:56.123456
如果要删除分钟和秒,请截断。
LocalDateTime.now(
ZoneId.of( "America/Montreal" )
)
.truncatedTo( ChronoUnit.HOURS )
.toString()
2018-01-23T12:00:00
Calendar
类现在已被遗留,被现代的 java.time 类所取代。另外,Calendar
始终带有时区,因此无法满足您的需求。
在 java.time 中,用“ Local…”命名的三个类故意缺少时区或从UTC偏移的概念。单词 local 表示任何位置或每个位置,而不是特定的位置。
LocalDate
仅日期的值,缺少日期和时区。
LocalTime
一天中的时间值,缺少日期,并且没有时区。仅限24小时。
LocalDateTime
具有日期的日期,缺少时区。
不是代表时刻,是不是在时间轴上的一点。表示大约26-27小时范围内的潜在时刻(各个时区使用的各种偏移量)。在您应用时区或UTC偏移量来确定特定时刻之前,LocalDateTime
并没有真正的含义。
使用Instant
类以UTC捕获当前时刻。此类使用十亿分之一秒的分辨率,但是当前时刻可能不太好,具体取决于JVM实现,主机OS和主机计算机硬件时钟的限制。
Instant instant = Instant.now() ; // Capture current moment in UTC.
如果要通过特定区域的人员所用的单击墙时间来查看当前时刻,请应用时区。应用ZoneId
以获得ZonedDateTime
。
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
要仅使用该ZonedDateTime
中的日期和日期,而放弃时区,请生成一个LocalDateTime
对象。
LocalDateTime ldt = zdt.toLocalDateTime() ; // Extract the date and time-of-day but omit the time zone.
作为快捷方式,您可以跳过分区的对象Instant
和ZonedDateTime
。您仍然需要一个时区ZoneId
,因为任何给定的时刻,日期和时间都会在全球范围内变化。 ZoneId
用于确定当前时刻,如该地区人民使用的挂钟时间所示。捕获后,ZoneId
对象将被遗忘LocalDateTime
对象。如果要保留该区域,请记住该区域,您将使用ZonedDateTime
而不是LocalDateTime
。
LocalDateTime ldt = LocalDateTime.now( z ) ;
如果要在运行时提供JVM的当前默认时区,请将调用返回的ZoneId
传递给ZoneId.systemDefault
。请注意,该JVM内任何应用程序的任何线程中的任何代码均可随时更改默认值。
如果要使用UTC而不是某个时区,请从ZoneOffset
的{{1}}子类,ZoneId
传递常量。
ZoneOffset.UTC
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要LocalDateTime.now( ZoneOffset.UTC ) // Capture the current date and time of day as seen in UTC (an offset of zero), and then discard that offset/zone info.
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:2)
正如cricket_007所述,您想看看LocalDate类。这是没有时区的日期。
它具有获取当前时间并将其转换为分区日期或日期时间的方法。这是Java中“新”时间API的一部分,该API的设计理念是要求您考虑数据的含义,因为时间和日期为incredibly hard to get right。
我们在说持续时间吗?使用Duration。
您是否要使用ZonedDateTime向用户显示时间,但是由于夏时制等原因,不要期望那里的值是连续的。
我们是否在谈论线性时间,其中给定时间只有一个值?您需要一个Instant。
其想法是设计API,以便您无需考虑这些因素就无法使用不同的数据类型。如果您想了解更多信息,可以从Joda Time开始,java.time是当今https://www.mssqltips.com/sqlservertip/2356/overview-of-with-result-sets-feature-of-sql-server-2012/
的前身