【问题标题】:Convert Calender to Date according to timezone [duplicate]根据时区将日历转换为日期[重复]
【发布时间】:2021-04-30 05:25:15
【问题描述】:

我写了一个代码,其中日历是根据时区准备的。

 Calendar toDayDateCalendar = Calendar.getInstance(TimeZone.getTimeZone(appTheme.getTimezoneId()));

Date formattedSelectedDate = toDayDateCalendar.getTime();

但是我根据系统获取“formattedSelectedDate”。我想根据时区获取日期。我怎样才能得到它。

【问题讨论】:

标签: java timezone


【解决方案1】:

(A) java.util.Date 对象尽管有名称,但它表示日期和时间,如 UTC 所示。 Date 没有时区。好吧,实际上它确实很深,但对于我们这里的目的而言,这无关紧要。

所以你对“我想根据时区获取日期”的期望是没有意义的。

(B) 您正在使用 terrible 日期时间类,这些类在几年前已被现代 java.time 类所取代。永远不要使用Calendar,永远不要使用Date,永远不要使用TimeZone。

获取特定时区的当前时刻。

ZoneId zoneId = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime nowTunis = ZonedDateTime.now( zoneId ) ;

如果您只需要日期、没有时间和时区,请使用LocalDate。

ZoneId zoneId = ZoneId.of( "Asia/Tokyo" ) ;
LocalDate todayTokyo = LocalDate.now( zoneId ) ;

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。 Hibernate 5 & JPA 2.2 支持 java.time。

从哪里获取 java.time 类?

【讨论】:

  • 如果您只想要日期、没有时间和没有时区,请使用 LocalDate。“没有时区”是什么意思。
  • @user3692033 LocalDate 只有一年、一个月和一个月中的某一天。但没有时区。例如,“2021 年 1 月 23 日”,LocalDate.of( 2021 , Month.JANUARY , 23 )。我们不知道这是否意味着日本东京的 23 日或美国俄亥俄州托莱多的 23 日——这两个日期发生在非常不同的时间,相差几个小时。对于任何给定的时刻,日期在全球范围内因时区而异。日本的这一天开始和结束的时间比美国大陆早得多。此外,如果我们考虑时区,一天的长度可能会有所不同,因为夏令时 (DST) 等异常情况。
  • 我们可以为 LocalDate 设置不同的时区吗?
  • 不,@user3692033,LocalDate 没有时区,所以这没有意义。你为什么要这么做?问是因为肯定有一种方法可以通过 java.time 实现您的最终目标。
猜你喜欢
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 2018-10-17
  • 2012-11-13
  • 2011-09-05
  • 1970-01-01
  • 2015-08-08
相关资源
最近更新 更多