Java 8 在java8中创建具有不同区域的日期

Java 8 在java8中创建具有不同区域的日期,java-8,zoneddatetime,Java 8,Zoneddatetime,我正在尝试从系统默认时区创建带有US时区的Date对象 我正在使用Java8新的日期时间API。创建我正在使用的日期对象 日历API。是否有任何方法可以在不使用日历的情况下创建日期对象 下面的代码按预期工作,但只想知道是否还有其他更好的方法 ZonedDateTime timeZone = ZonedDateTime.ofInstant( new Date().toInstant(), ZoneId.systemDefault()); Calendar c = Cal

我正在尝试从系统默认时区创建带有US时区的
Date
对象

我正在使用Java8新的日期时间API。创建我正在使用的日期对象
日历
API。是否有任何方法可以在不使用日历的情况下创建日期对象

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

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);
tl;博士
  • 没有“带US时区的日期对象”之类的东西。
    日期始终以UTC为单位
  • 避免遗留日期时间类。仅使用java.time类
  • 将时区应用于UTC中的某个时刻不会改变其含义,仍然是时间线上的同一点
避免遗留日期时间类 不要将java.time类与臭名昭著的旧日期时间类(如
Calendar
TimeZone
)混用。完全避免遗留类

这已经在堆栈交换中多次出现。请在邮寄前搜索。这里我只做一个简短的回顾

分辨率为纳秒的当前力矩

Instant instant = Instant.now();
应用时区

ZoneId z = ZoneId.of( "America/Anchorage" );
ZonedDateTime zdt = instant.atZone( z );
您可能无法理解应用时区不会改变其含义。该区域仅允许通过特定区域图像的透镜查看该值。但本例中的
瞬间
zdt
都表示非常相同的时刻,即时间轴上非常相同的点

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

正在尝试使用US时区创建日期对象

没有这样的事。根据定义,
java.util.Date
始终使用UTC

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

java.util.Date d = java.util.Date.from( instant ) ;
用java.time完成所有实际工作。尽可能避免遗留类(它们是一场血腥的噩梦)。

tl;博士
  • 没有“带US时区的日期对象”之类的东西。
    日期始终以UTC为单位
  • 避免遗留日期时间类。仅使用java.time类
  • 将时区应用于UTC中的某个时刻不会改变其含义,仍然是时间线上的同一点
避免遗留日期时间类 不要将java.time类与臭名昭著的旧日期时间类(如
Calendar
TimeZone
)混用。完全避免遗留类

这已经在堆栈交换中多次出现。请在邮寄前搜索。这里我只做一个简短的回顾

分辨率为纳秒的当前力矩

Instant instant = Instant.now();
应用时区

ZoneId z = ZoneId.of( "America/Anchorage" );
ZonedDateTime zdt = instant.atZone( z );
您可能无法理解应用时区不会改变其含义。该区域仅允许通过特定区域图像的透镜查看该值。但本例中的
瞬间
zdt
都表示非常相同的时刻,即时间轴上非常相同的点

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

正在尝试使用US时区创建日期对象

没有这样的事。根据定义,
java.util.Date
始终使用UTC

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

java.util.Date d = java.util.Date.from( instant ) ;
用java.time完成所有实际工作。尽可能避免遗留类(它们是一场血腥的噩梦)