在Java 7中格式化ISO 8601

时间:2017-09-19 12:29:42

标签: java datetime simpledateformat datetime-parsing

我有这样的日期格式2016-11-25T09:29:10.588+01:00

我想将此转换为milliseconds,稍后在打印时我必须再次将毫秒转换为“yyyy-MM-dd HH:mm:ss.SSS”这种格式。

static FastDateFormat alarmDateFormat = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS");
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSXXX");
df1.setTimeZone(TimeZone.getTimeZone("UTC"));
String string1 = "2016-11-25T09:29:10.588+01:00";
Date result1 = df1.parse(string1);
long timeStamp = result1.getTime();
System.out.println("timeStamp : " +timeStamp);
String eventTime = alarmDateFormat.format(timeStamp);
System.out.println("AfterConverting : " + eventTime);

结果:

timeStamp : 1480062550588
AfterConverting : 2016-11-25 13:59:10.588

Date是正确的,但时间不同。我已经尝试将时区设置为“UTC”,但它没有帮助。

请注意:在Java 8中,它可以与其他库(如Instant)以及Java 7中的所有库一起使用。

1 个答案:

答案 0 :(得分:4)

您正在ROW_NUMBER中调用setTimeZone,但此格式化程序仅用于解析,并且不会对格式化产生任何影响。

要将日期格式化为特定时区,您必须在另一个格式化程序中设置它(如果您未设置,格式化程序将使用JVM默认时区)。此外,您不需要依赖其他课程,例如df1,您只需使用其他课程FastDateFormat

但要获得完全相同的日期/时间,您需要使用输入中使用的相同偏移量(SimpleDateFormat)。 +01:00个对象don't keep this information,因此您必须从输入中提取它。一种方法是使用Date

substring

输出将是:

  

timeStamp:1480062550588
  AfterConverting:2016-11-25 09:29:10.588

如果您想继续使用SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSXXX"); String string1 = "2016-11-25T09:29:10.588+01:00"; Date result1 = df1.parse(string1); long timeStamp = result1.getTime(); System.out.println("timeStamp : " + timeStamp); // extract the +01:00 offset from the input String offset = string1.substring(23); SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); // set the offset in the formatter (so output is converted to it) df2.setTimeZone(TimeZone.getTimeZone("GMT" + offset)); String eventTime = df2.format(timeStamp); System.out.println("AfterConverting : " + eventTime); ,也可以在其中设置时区:

FastDateFormat

Java新日期/时间API

旧类(FastDateFormat f = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS", TimeZone.getTimeZone("GMT" + offset)); String eventTime = f.format(timeStamp); DateCalendar)有lots of problemsdesign issues,并且它们被新API取代

对于 Java 7 ,您可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。对于 Android ,您还需要ThreeTenABP(更多关于如何使用它here)。

使用此功能,您可以将输入解析为SimpleDateFormat并使用org.threeten.bp.OffsetDateTime作为输出。在这种情况下,org.threeten.bp.format.DateTimeFormatter会保留偏移量信息,因此您无需在格式化程序中设置它:

OffsetDateTime

输出相同:

  

timeStamp:1480062550588
  AfterConverting:2016-11-25 09:29:10.588