Java中的GregorianCalendar类

时间:2015-02-03 10:50:02

标签: java gregorian-calendar

我想在其他时区获取当前时间。我用这个代码:

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

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

3 个答案:

答案 0 :(得分:3)

啊,Java Date / Time API的乐趣......

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

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

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

完成这些计算后,您可以通过调用返回calendar.getTime()的{​​{1}}来获得结果。

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

答案 1 :(得分:2)

你现在正在做的是:

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

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

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

答案 2 :(得分:1)

tl; dr

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 [亚洲/曼谷]


Table of date-time types in Java, both modern and legacy


关于 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 driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容打下了基础。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore