如何转换字符串do Java.util.Date,包括ISO8601

如何转换字符串do Java.util.Date,包括ISO8601,java,parsing,date,calendar,timezone,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 dif

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

“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");
}
//示例日期
字符串timeString=“2014-04-11T13:25:58.025+02:00”;
长差=660000;
Calendar cSchedStartCal=Calendar.getInstance(TimeZone.getTimeZone(“GMT”));
cSchedStartCal.setTimeZone(TimeZone.getTimeZone(“欧洲/苏黎世”);
cSchedStartCal=DatatypeConverter.parseDateTime(timeString);
日期日期=新日期(cSchedStartCal.getTime().getTime());
if(date.getTime()+差
但是当日期不太旧时,我发现它太旧了,因为时区肯定有问题

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

我不可能使用joda图书馆。

您需要:

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及更高版本

对于你的第二个问题,为什么这个简单的方法不把你的时区和日历去掉呢?许多人将时间量(如10分钟)与全球时间联系起来,而不是在本地时区的DST跳转期间

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

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

您的语句“属性日期始终没有+02:00,这就是问题所在”一点也不清楚<代码>日期
-对象从不具有内部时区偏移。你为什么这么想?我已经试过了。它起作用了。但我仍然有问题,当我得到:d.getTime()是2014-04-11T13:25:58.025的毫秒,而不是2014-04-11T15:25:58.025时,2小时总是缺失,我不会手动添加2小时。
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)