tl;博士
java.time.ZonedDateTime.now(
ZoneId.of( "Asia/Kuala_Lumpur" )
).toString()
2018-01-23T18:48:32.263+08:00[Asia/Kuala_Lumpur]
避免遗留类
问题和其他答案使用麻烦的旧日期时间类,这些类现在是遗留的,被 java.time 类取代。
java.time
现代方法使用 java.time 类。忘记所有令人困惑的Calendar 类。
当前时刻
首先获取 UTC 中的当前时刻。 Instant 类代表UTC 时间线上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。
Instant instant = Instant.now() ;
时区
调整到另一个时区。
以continent/region 的格式指定proper time zone name,例如America/Montreal、Africa/Casablanca 或Pacific/Auckland。切勿使用 3-4 个字母的伪时区,例如 EST 或 IST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。
ZoneId z = ZoneId.of( "Asia/Kuala_Lumpur" ) ; // Or "Asia/Kuching", etc.
应用ZoneId 来实例化ZonedDateTime 对象。 ZonedDateTime 和 Instant 都代表同一时刻,时间轴上的同一点,但通过不同的挂钟时间查看。
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
偏移
如果您只有一个offset-from-UTC,例如+08:00,而不是已知的time zone,您将使用ZoneOffset 来获得OffsetDateTime,而不是ZoneId 和ZonedDateTime。但是时区总是比单纯的偏移更可取。区域是特定区域的人们使用的偏移量的历史记录。
字符串
要生成标准ISO 8601 格式的字符串,请调用toString 方法。
ZonedDateTime 类明智地扩展了标准,将时区名称附加在方括号中。
String output = zdt.toString() ; // YYYY-MM-DDTHH:MM:SS.SSSSSSSSS[tz]
根据用户的偏好进行本地化。要进行本地化,请指定:
-
FormatStyle 确定字符串的长度或缩写。
-
Locale 确定 (a) 用于翻译日期名称、月份名称等的人类语言,以及 (b) 决定缩写、大写、标点符号、分隔符等问题的文化规范。
语言环境 l = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withLocale(l);
字符串输出 = zdt.format( f );
转储到控制台。
System.out.println( "instant.toString(): " + instant ) ;
System.out.println( "output: " + output ) ;
System.out.println( "outputLocalized (always Locale.US on IdeOne.com): " + outputLocalized ) ;
看到这个code run live at IdeOne.com。请注意,IdeOne.com 会覆盖任何 Locale 设置以始终使用 Locale.US。
instant.toString(): 2018-01-23T10:48:32.263Z
输出:2018-01-23T18:48:32.263+08:00[Asia/Kuala_Lumpur]
ooutputLocalized(在 IdeOne.com 上始终为 Locale.US):2018 年 1 月 23 日星期二下午 6:48:32 MYT
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。