Java中的GregorianCalendar类

问题描述 投票:4回答:3

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

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

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

java gregorian-calendar
3个回答
3
投票

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

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

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

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

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

A Date本质上是通用时间戳记(自1970年以来以毫秒为单位,没有附加或相关的时区信息)。如果在toString上调用Date,它将仅在您的默认时区中打印一些内容。要进行更多控制,请使用DateFormat


2
投票

您现在正在做的是:

  • 在曼谷时区获取日历
  • 获取当前时间的Date对象(自some date 1970年1月1日,格林尼治标准时间00:00:00以毫秒为单位)
  • 打印此日期在您的时区(Date.toString()

您应该使用Formatter类来获取所需的结果。例如Date.toString()

一种替代解决方案是使用不太混乱的日期/时间库。例如SimpleDateFormat或Java8的新JodaTime


0
投票

tl; dr

java.time

java.time

您正在使用的旧式日期时间类非常糟糕,设计和实现上都有缺陷,由不了解日期时间处理的人员构建。完全避免使用这些类。

仅使用ZonedDateTime.now( ZoneId.of( "Asia/Bangkok" ) ) 中定义的现代java.time类。

JSR 310

生成标准ZoneId z = ZoneId.of( "Asia/Bangkok" ) ; ZonedDateTime zdt = ZonedDateTime.now( z ) ; 格式的文本,明智地扩展以在时括号内附加时区名称。

ISO 8601

对于其他格式,请使用String output = zdt.toString() ; ,如在其他数百个问答中所见。


DateTimeFormatter


关于java.time

DateTimeFormatter框架内置于Java 8及更高版本中。这些类取代了麻烦的旧Table of date-time types in Java, both modern and legacy日期时间类,例如java.timelegacyjava.util.Date

要了解更多信息,请参见java.util.Date。并在Stack Overflow中搜索许多示例和说明。规格为Calendar

Calendar项目现在位于SimpleDateFormat中,建议迁移到SimpleDateFormat类。

您可以直接与数据库交换java.time对象。使用兼容Oracle Tutorial或更高版本的JSR 310。不需要字符串,不需要Joda-Time类。

从哪里获取java.time类?

  • ThreeTen-Backport项目使用其他类扩展了java.time。该项目是将来可能向java.time添加内容的试验场。您可能会在这里找到一些有用的类,例如AndroidThreeTenABPThreeTen-BackportHow to use ThreeTenABP…
  • © www.soinside.com 2019 - 2024. All rights reserved.