【问题标题】:How to convert String do Java.util.Date including ISO8601如何转换 String 做 Java.util.Date 包括 ISO8601
【发布时间】:2014-05-25 17:43:21
【问题描述】:

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

“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 库。

【问题讨论】:

  • 您的陈述“属性日期始终没有 +02:00,这就是问题所在”根本不清楚。 Date-objects 永远不会有内部时区偏移。为什么会这样?

标签: java parsing date calendar timezone


【解决方案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-code 排除在外?许多人将时间量(例如 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 纪元时间(以毫秒为单位)

如果您选择以下具有相同瞬间的类似表示,则此历元值不会改变:

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 时区的全球时间,您必须减去偏移量,而不是添加偏移量。

【讨论】:

  • 我已经尝试过这种解析。有用。但是我仍然有问题,当我得到: d.getTime() 是 2014-04-11T13:25:58.025 的毫秒而不是 2014-04-11T15:25:58.025 2 小时总是丢失,我不会手动添加 2 小时。
猜你喜欢
  • 1970-01-01
  • 2015-06-08
  • 2021-02-25
  • 2014-08-25
  • 2012-05-24
  • 1970-01-01
  • 2011-08-01
  • 2012-09-10
相关资源
最近更新 更多