我有一个日期,例如2000-01-01T10:00:00Z
。这代表商店的开放时间,所以这意味着商店在10点开门。其他信息没用,它是一个随机的日期。
我只需要将其表示为一个字符串,所以:10:00。
对于这种转换,我使用了一种简单的方法:
public String dateToString(Date date){
SimpleDateFormat ft = new SimpleDateFormat ("HH:mm");
String time= ft.format(date);
return time;
}
我认为这应该有效,首都HH 24小时代表小时。但是当我运行此代码时,返回值是11:00! 为什么会这样,以及如何预防呢?格式化功能是否会查看我的时区并且在日期中设置错误(我认为我的手机设置为mgt + 1,因为我住在荷兰)?如何忽略这个?
答案 0 :(得分:1)
这有效:
public String dateToString(Date date){
SimpleDateFormat ft = new SimpleDateFormat ("HH:mm");
ft.setTimeZone(TimeZone.getTimeZone("UTC"));
String time= ft.format(date);
return time;
}
答案 1 :(得分:0)
值2000-01-01T10:00:00Z
根本不是“无用”。这描述了时间轴上的确切时刻,包括日期,时间和offset-from-UTC,在这种情况下UTC本身。{/ p>
该字符串格式由ISO 8601标准定义。最后Z
是Zulu
的缩写,表示UTC。
Instant
您可以直接将此字符串解析为Instant
。 Instant
类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds。这意味着最多九(9)位小数。
Instant instant = Instant.parse( "2000-01-01T10:00:00Z" );
Instant
类只是Java中的基本构建块类。为了获得更大的灵活性,我们应该:
ZoneOffset
)的瞬间以获得OffsetDateTime
。ZoneId
)以获取ZonedDateTime
。有什么区别?时区是偏移量加上用于处理Daylight Saving Time (DST)等异常的一组规则。
OffsetDateTime
因此,如果你真的想要在UTC时看到这个时刻的时间,那么分配一个UTC(ZoneOffset.UTC
)的偏移量来获得OffsetDateTime
,然后提取一个{{ 1}}对象。 LocalTime
表示没有日期且没有时区的时间。
LocalTime
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
LocalTime lt = odt.toLocalTime(); // 10:00:00
如果您希望通过另一个时区的镜头看到同一时刻,要查看该特定区域的wall-clock time,请指定ZonedDateTime
。例如,在魁北克省的同一时刻落后于 UTC。
ZoneId
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date
,.Calendar
和& java.text.SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。