java.time
使用现代日期时间 APIjava.time
的解决方案:
现代日期时间 API 提供OffsetDateTime
了表示具有时区偏移的日期时间对象。它可以转换为Instant
代表时间轴上的瞬时点的哪一个。AnInstant
独立于任何时区,即它具有+00:00
小时的时区偏移量,Z
在ISO 8601标准中指定。
Instant#toEpochMilli
将此瞬间转换为从 1970-01-01T00:00:00Z 开始的毫秒数。该值可以设置为一个对象,GregorianCalendar
然后该对象将代表同一时刻。
演示:
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String strDateTime = "Mon, 27 Oct 2008 08:33:29 -0700";
OffsetDateTime odt = OffsetDateTime.parse(strDateTime, DateTimeFormatter.RFC_1123_DATE_TIME);
System.out.println(odt);
// In case you want a time zone neutral object, convert to Instant
Instant instant = odt.toInstant();
System.out.println(instant);
// Edit: If the requirement is a GregorianCalendar having the offset from
// the string — typically for an old API not yet upgraded to java.time:
ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, DateTimeFormatter.RFC_1123_DATE_TIME);
GregorianCalendar gc = GregorianCalendar.from(zdt);
System.out.println("As Date: " + gc.getTime());
System.out.println("Time zone ID: " + gc.getTimeZone().getID());
System.out.println("Hour of day: " + gc.get(Calendar.HOUR_OF_DAY));
// ...
}
}
输出:
2008-10-27T08:33:29-07:00
2008-10-27T15:33:29Z
As Date: Mon Oct 27 15:33:29 GMT 2008
Time zone ID: GMT-07:00
Hour of day: 8
调用转换为没有时区的getTime()
(另一个旧且容易出错的类),因此偏移量丢失。打印时区 ID 和时间表明偏移量和时间都保存在.GregorianCalendar
Date
GregorianCalendar
从Trail: Date Time了解有关现代日期时间 API 的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring和How to use ThreeTenABP in Android Project。