我想在其他时区获取当前时间。我用这个代码:
GregorianCalendar calender = new
GregorianCalendar(TimeZone.getTimeZone("Asia/Bangkok"));
System.out.println(calender.getTime());
但是,当我运行此代码时,此代码在CET中提供当前时间,因为本地计算机中的时间是在CET中。 我很迷惑。那为什么在构造函数中有提供TimeZone的范围呢?
答案 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.toString()
)您应该使用Formatter类来获得所需的结果。例如SimpleDateFormat
答案 2 :(得分:1)
ZonedDateTime.now( ZoneId.of( "Asia/Bangkok" ) )
您使用的传统日期时间类非常糟糕,在设计和实现方面存在缺陷,由不了解日期时间处理的人员构建。完全避免使用这些类。
仅使用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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅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中添加内容打下了基础。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。