0

我正在尝试Date从系统默认时区创建具有美国时区的对象。

我正在使用 java 8 新的日期时间 API。要创建日期对象,我正在使用 CalendarAPI。有什么办法可以Date用 out 创建对象Calendar吗?

下面的代码按预期工作,但只是想知道是否还有其他更好的方法。

ZonedDateTime timeZone = ZonedDateTime.ofInstant(
            new Date().toInstant(), ZoneId.systemDefault());

Calendar c =  Calendar.getInstance();
timeZone = timeZone.withZoneSameInstant((ZoneId
        .of("America/Anchorage")));
// Calendar c = Calendar.getInstance();
c.set(timeZone.getYear(),
        timeZone.getMonthValue() - 1,
        timeZone.getDayOfMonth(),
        timeZone.getHour(), timeZone.getMinute());
Date usDate = c.getTime();
System.out.println(usDate);
4

1 回答 1

4

tl;博士

  • 没有“美国时区的日期对象”之类的东西。ADate始终采用 UTC。
  • 避免使用旧的日期时间类。仅使用 java.time 类。
  • 将时区应用于 UTC 中的某个时刻不会改变其含义,仍然是时间线上的同一点。

避免遗留的日期时间类

不要将 java.time 类与臭名昭著的老旧日期时间类(例如Calendar和)混用TimeZone完全避免遗留类。

这已经在 Stack Exchange 上多次介绍过。发帖前请先搜索。我在这里只做一个简短的回顾。

UTC中的当前时刻,分辨率为纳秒。

Instant instant = Instant.now();

应用时区。

ZoneId z = ZoneId.of( "America/Anchorage" );
ZonedDateTime zdt = instant.atZone( z );

您可能无法理解应用时区不会改变含义。该区域仅允许通过特定区域的挂钟时间的镜头查看此值。但是这个例子中的instant和都代表同一个时刻,时间轴上的同一个点zdt

兑换

如果您必须java.util.Date与尚未针对 java.time 类型更新的旧代码进行互操作,请转换。使用添加到旧类的新方法与 java.time 进行转换。

尝试使用美国时区创建 Date 对象

没有这样的事。根据定义, Ajava.util.Date始终为 UTC。

java.time 中的等价物java.util.DateInstant. 您可以转换,但要注意纳秒与小数秒内的毫秒分辨率的数据丢失。

java.util.Date d = java.util.Date.from( instant ) ;

在 java.time 中完成所有实际工作。尽可能避免遗留类(它们是一场血腥的噩梦)。

于 2017-05-02T17:24:56.887 回答