Java 中的公历 Class

GregorianCalendar Class in Java

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

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

但是,当我运行这段代码时,这段代码提供了 CET 的当前时间,因为我本地机器上的时间是 CET。 我很困惑。那为什么在构造函数中有提供时区的范围?

啊,Java Date/Time API ...

的快乐

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

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

Calendar 用于时间操作和计算。例如 "set the time to 10 AM"。然后它需要时区。

完成这些计算后,您可以通过调用 calendar.getTime() which returns a Date.

来获得结果

A Date 本质上是一个通用时间戳(自 1970 年以来的毫秒数,没有附加或相关的时区信息)。如果您在 Date 上调用 toString,它只会在您的默认时区打印一些内容。要获得更多控制,请使用 DateFormat.

您现在正在做的是:

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

您应该使用格式化程序 class 来获得您想要的结果。例如SimpleDateFormat

另一种解决方案是使用更容易混淆的 Date/Time 库。例如JodaTime or the new java.time 包 Java8

tl;博士

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

java.time

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

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

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[Asia/Bangkok]



关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

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

Joda-Time project, now in maintenance mode, advises migration to the java.time 类.

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

java.time类在哪里获取?

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.