java.time
以下引用来自home page of Joda-Time的通知:
请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。
使用现代日期时间 API java.time 的解决方案:
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZonedDateTime zdt = ZonedDateTime.of(LocalDateTime.of(LocalDate.EPOCH, LocalTime.of(12, 0)), ZoneOffset.UTC);
System.out.println(zdt);
}
}
输出:
1970-01-01T12:00Z
ONLINE DEMO
几个重要说明:
-
ZonedDateTime#toString 如果秒数和秒数为零,则删除它们。如果要显示它们,可以使用DateTimeFormatter 例如
String formatted = zdt.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH));
- 输出中的
Z 是零时区偏移的timezone designator。它代表 Zulu 并指定 Etc/UTC 时区(时区偏移量为 +00:00 小时)。
从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。
你的代码出了什么问题?
下面引用的是DateTime(long)的描述,我强调:
使用 ISOChronology在默认时区构造一个设置为从 1970-01-01T00:00:00Z 开始的毫秒数的实例。
您的位置,Israel was at an offset of +02:00 hours in 1970,因此 DateTime 实例以 +02:00 小时的偏移量实例化。
演示:
import java.util.concurrent.TimeUnit;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
public class Main {
public static void main(String[] args) {
DateTime defaultDate = new DateTime(TimeUnit.HOURS.toMillis(12), DateTimeZone.UTC);
System.out.println(defaultDate);
}
}
输出:
1970-01-01T12:00:00.000Z
您可能已经从代码中注意到的另一件事是,如果已经有标准 API(例如 TimeUnit#toMillis)可用,则不要自己执行计算。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。