当前时间未转换为MST时区

时间:2016-08-12 09:11:14

标签: java date time timezone

我正在尝试使用以下代码转换MST中的当前时间

DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
TimeZone toTimeZone = TimeZone.getTimeZone("MST");
sdf.setTimeZone(toTimeZone);
Date date = new Date();
String strDate = sdf.format(date.getTime());

strDate显示正确的MST时间,但在解析之后它给出了错误的日期时间。

Date currentDate = sdf.parse(strDate);

我希望Date格式的当前MST时间不在字符串中。

2 个答案:

答案 0 :(得分:3)

java.util.Date对象没有时区概念。

  • 无法为日期
  • 设置时区
  • 无法更改Date对象的时区
  • 使用新的Date()默认构造函数创建的Date对象将使用系统默认时区中的当前时间进行初始化

您所做的就是为格式部分添加时区信息... setTimeZone不会转换任何内容。

答案 1 :(得分:0)

TL;博士

ZonedDateTime zdt = LocalDateTime.parse( input , DateTimeFormatter.forPattern( "dd/MM/uuuu hh:mm:ss" ) ).atZone( ZoneId.of( "America/Denver" ) );

避免遗留日期时间类

您正在使用旧的过时麻烦的旧日期时间类。

java.time

java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormat

现在在maintenance mode中,Joda-Time项目还建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。

LocalDateTime

您的输入字符串缺少offset-from-UTCtime zone的任何指示。所以我们必须解析为LocalDateTimeLocalDateTime没有偏移或时区,因此表示时间轴上的时刻。就像说“12月25日午夜圣诞节开始”,当你将它应用到地球某个特定时区时,它只有意义(只在时间轴上成为一个点)。

String input = …
DateTimeFormatter f = DateTimeFormatter.forPattern( "dd/MM/uuuu hh:mm:ss" );
LocalDateTime ldt = LocalDateTime.parse( input , f );

ZonedDateTime

如果您知道上下文并且可以假定预期的偏移或时区,则可以分别创建OffsetDateTimeZonedDateTime

使用proper time zone names,格式为continent/region。到MST或许你的意思是美国落基山脉大部分地区使用的America/Denver时区,或加拿大部分地区使用America/Edmonton

切勿使用诸如MST之类的3-4个字母缩写。这些缩写不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId zoneId = ZoneId.of( "America/Denver" ) ; 
ZonedDateTime zdt = ldt.atZone( zoneId ) ;

转换

我建议避免臭名昭着的java.util.Date课程。但如果你必须这样做,你可以convert to/from java.time types。要与其他代码或库进行互操作,请使用添加到旧类的新方法进行转换。在这种情况下,请使用从OffsetDateTimeZonedDatetime中提取的Instant对象并传递给java.util.Date.from

Instant类代表UTC时间轴上的一个时刻,分辨率为nanoseconds

java.util.Date utilDate = java.util.Date.from( zdt.toInstant() ) ;

转向另一个方向,使用添加到旧班级的另一个新方法java.util.Instant::toInstant

Instant instant = utilDate.toInstant();
ZonedDateTime zdt = instant.atZone( zoneId ) ;