我正在尝试使用以下代码转换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时间不在字符串中。
答案 0 :(得分:3)
java.util.Date对象没有时区概念。
您所做的就是为格式部分添加时区信息... setTimeZone
不会转换任何内容。
答案 1 :(得分:0)
ZonedDateTime zdt = LocalDateTime.parse( input , DateTimeFormatter.forPattern( "dd/MM/uuuu hh:mm:ss" ) ).atZone( ZoneId.of( "America/Denver" ) );
您正在使用旧的过时麻烦的旧日期时间类。
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-UTC或time zone的任何指示。所以我们必须解析为LocalDateTime
。 LocalDateTime
没有偏移或时区,因此不表示时间轴上的时刻。就像说“12月25日午夜圣诞节开始”,当你将它应用到地球某个特定时区时,它只有意义(只在时间轴上成为一个点)。
String input = …
DateTimeFormatter f = DateTimeFormatter.forPattern( "dd/MM/uuuu hh:mm:ss" );
LocalDateTime ldt = LocalDateTime.parse( input , f );
ZonedDateTime
如果您知道上下文并且可以假定预期的偏移或时区,则可以分别创建OffsetDateTime
或ZonedDateTime
。
使用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。要与其他代码或库进行互操作,请使用添加到旧类的新方法进行转换。在这种情况下,请使用从OffsetDateTime
或ZonedDatetime
中提取的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 ) ;