日期时间字符串转换错误一小时

时间:2012-07-28 20:41:54

标签: java android string date time

我有一个日期,例如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,因为我住在荷兰)?如何忽略这个?

2 个答案:

答案 0 :(得分:1)

哦,找到了! Android将日期转换为设备的时区。我不得不否决:

这有效:

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

该字符串格式由ISO 8601标准定义。最后ZZulu的缩写,表示UTC。

Instant

您可以直接将此字符串解析为InstantInstant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds。这意味着最多九(9)位小数。

Instant instant = Instant.parse( "2000-01-01T10:00:00Z" );

Instant类只是Java中的基本构建块类。为了获得更大的灵活性,我们应该:

  • 指定一个偏离UTC(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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormat

现在位于Joda-Timemaintenance 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的试验场。