java.time
与 Java 捆绑在一起的旧日期时间类和第三方 Joda-Time 库都已被Java 8 及更高版本中内置的java.time框架所取代。这些类取代了旧的麻烦的日期时间类,例如java.util.Date
. 请参阅Oracle 教程。许多 java.time 功能在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在ThreeTenABP中进一步适应 Android 。
顺便说一句,永远不要使用一位数的小时数来引用与UTC 的偏移量,例如-7
,因为这是非标准的,并且与各种协议和库不兼容。始终用零填充第二个数字,例如-07
.
如果您只有一个偏移量而不是时区,请使用OffsetDateTime
该类。
ZoneOffset offset = ZoneOffset.ofHours( -7 );
OffsetDateTime odt = OffsetDateTime.now( offset );
String output1 = odt.toLocalTime().toString();
System.out.println( "Current time in " + offset + ": " + output1 );
当前时间在-07:00: 19:41:36.525
如果您有一个完整的时区,它是一个偏移量加上一组用于处理诸如夏令时 (DST) 等异常的规则,而不仅仅是与 UTC 的偏移量,请使用ZonedDateTime
该类。
ZoneId denverTimeZone = ZoneId.of( "America/Denver" );
ZonedDateTime zdt = ZonedDateTime.now( denverTimeZone );
String output2 = zdt.toLocalTime().toString();
System.out.println( "Current time in " + denverTimeZone + ": " + output2 );
美国/丹佛当前时间:20:41:36.560
在 Ideone.com 中查看此代码。
乔达时间
您可以在 Android 中使用Joda-Time 2.7。使日期时间工作更容易。
DateTimeZone zone = DateTimeZone.forID ( "America/Denver" );
DateTime dateTime = new DateTime ( zone );
String output = dateTime.toLocalTime ().toString ();
转储到控制台。
System.out.println ( "zone: " + zone + " | dateTime: " + dateTime + " | output: " + output );
运行时……</p>
地区:美国/丹佛 | 日期时间:2016-07-11T20:50:17.668-06:00 | 输出:20:50:17.668
从纪元开始计数
我强烈建议不要按自计数按时间跟踪。但如果有必要,您可以通过调用a 上的方法来提取 Joda-Time 的内部毫秒自纪元(Unix 时间,1970 UTC 的第一时刻)。getMillis
DateTime
请注意使用 64 位long
而不是 32 位int
原始类型。
在 java.time. 请记住,您可能会在这里丢失数据,因为 java.time 的分辨率高达纳秒。从纳秒到毫秒意味着最多截断一秒的十进制小数的六位数字(毫秒为 3 位,纳秒为 9 位)。
long millis = Instant.now ().toEpochMilli ();
在乔达时代。
long millis = DateTime.now( denverTimeZone ).getMillis();