Java 8 在java8中创建具有不同区域的日期
我正在尝试从系统默认时区创建带有US时区的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
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中的某个时刻不会改变其含义,仍然是时间线上的同一点
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中的某个时刻不会改变其含义,仍然是时间线上的同一点
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完成所有实际工作。尽可能避免遗留类(它们是一场血腥的噩梦)