【问题标题】:GregorianCalendar Class in JavaJava 中的 GregorianCalendar 类
【发布时间】:2021-01-02 01:12:46
【问题描述】:

我正在尝试获取其他时区的当前时间。我为此使用了此代码:

GregorianCalendar calender = new         
GregorianCalendar(TimeZone.getTimeZone("Asia/Bangkok"));
    System.out.println(calender.getTime());

但是,当我运行此代码时,此代码提供 CET 中的当前时间,因为我的本地计算机中的时间为 CET。 我很迷惑。那为什么还有在构造函数中提供 TimeZone 的范围呢?

【问题讨论】:

  • 当这个问题在 2015 年被问到时,现代 Java 日期和时间 API java.time 已经问世一年了。我建议你不要使用GregorianCalendarDate。这些课程设计不良且早已过时。更不用说在几个答案中建议的臭名昭著的DateFormat /SimpleDateFormat。见the good answer by Basil Bourque

标签: java gregorian-calendar


【解决方案1】:

啊,Java 日期/时间 API 的乐趣...

您想要的(除了更好的 API,例如 Joda Time)是 DateFormat。它可以在您指定的时区打印日期。你不需要Calendar

dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Bangkok"));
dateFormat.format(new Date());

Calendar 用于时间操作和计算。例如“将时间设置为上午 10 点”。然后它需要时区。

当您完成这些计算后,您可以通过调用calendar.getTime() 来获得结果,它会返回一个Date

Date 本质上是一个通用时间戳(自 1970 年以来以毫秒为单位,没有附加或相关的时区信息)。如果你在Date 上调用toString,它只会在你的默认时区打印一些东西。如需更多控制,请使用DateFormat

【讨论】:

    【解决方案2】:

    你现在正在做的是:

    • 在曼谷时区获取日历
    • 获取该时间的 Date 对象(从 某个日期 1970 年 1 月 1 日 00:00:00 GMT 开始以毫秒为单位)
    • 在您的时区打印此日期 (Date.toString())

    您应该使用 Formatter 类来获得您想要的结果。例如SimpleDateFormat

    另一种解决方案是使用不太容易混淆的日期/时间库。例如JodaTime 或 Java8 新的 java.time

    【讨论】:

      【解决方案3】:

      tl;博士

      ZonedDateTime.now( ZoneId.of( "Asia/Bangkok" ) )
      

      java.time

      您使用的遗留日期时间类简直太糟糕了,在设计和实现方面存在缺陷,由不了解日期时间处理的人构建。完全避免这些课程。

      仅使用JSR 310 中定义的现代java.time 类。

      ZoneId z = ZoneId.of( "Asia/Bangkok" ) ;
      ZonedDateTime zdt = ZonedDateTime.now( z ) ;
      

      以标准ISO 8601 格式生成文本,明智地扩展为在方括号中附加时区名称。

      String output = zdt.toString() ;
      

      对于其他格式,请使用 DateTimeFormatter,正如在数百个其他问题和答案中看到的那样。

      看到这个code run live at IdeOne.com

      2020-02-15T12:27:31.118127+07:00[亚洲/曼谷]



      关于java.time

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

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

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

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

      从哪里获得 java.time 类?

      ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-21
        • 2013-03-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        相关资源
        最近更新 更多