如何转换String do Java.util.Date包括ISO8601

时间:2014-04-11 13:59:44

标签: java parsing date calendar timezone

我从连接器中获取以下字符串:

  

" 2014-04-11T13:25:58.025 + 02:00"

我也是实际时间:

Calendar cal = Calendar.getInstance();
long timeNow = cal.getTimeInMillis();

如果连接器的日期超过10分钟,我应该定义。 所以我试图用毫秒来比较这两个日期。

//example date
String timeString = "2014-04-11T13:25:58.025+02:00";
long difference = 660000;

Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
cSchedStartCal.setTimeZone(TimeZone.getTimeZone("Europe/Zurich"));
cSchedStartCal = DatatypeConverter.parseDateTime(timeString);
Date date = new Date(cSchedStartCal.getTime().getTime());

if (date.getTime() + difference < timeNow) {
  System.out.println("too old");
} else {
  System.out.println("ok");
}

但是当日期不久以来,我已经太老了,因为时区一定存在问题。

属性日期始终没有+02:00,这就是问题所在。 是否可以以适当的方式将时区小时数添加到日期?

而且我没有机会使用joda库。

1 个答案:

答案 0 :(得分:1)

你需要:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
java.util.Date d = sdf.parse("2014-04-11T13:25:58.025+02:00");

XXX适用于Java 7及更高版本。

对于你的第二个问题,为什么这个简单的方法不能留下你的时区和Calendar - 代码?许多人将时间量与10分钟相关联,参考全球时间,而不是在当地时区的DST跳跃期间。

if (d.getTime() + 10 * 60 * 1000L < System.currentTimeMillis()) {
  System.out.println("too old");
} else {
  System.out.println("ok");
}

评论更新:

d.getTime()产生与2014-04-11T13:25:58.025 + 02:00相对应的unix纪元时间(以毫秒为单位)

如果您选择使用SAME instant进行类似的表示,则此纪元值不会更改:

2014-04-11T13:25:58.025+02:00
2014-04-11T12:25:58.025+01:00
2014-04-11T11:25:58.025Z (zero offset - zulu time)

表示2014-04-11T15:25:58.025没有偏移,因此无法比较。请记住,此类表示由本地时间加偏移量组成。因此,为了获得UTC时区的全球时间,您必须SUBTRACT偏移,而不是添加偏移量。