java - 在 Java 7 中格式化 ISO 8601

标签 java datetime simpledateformat datetime-parsing

我的日期格式如下 2016-11-25T09:29:10.588+01:00

我想将其转换为毫秒,然后在打印时我必须再次将毫秒转换为“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

日期 正确,但时间不同。我尝试将时区设置为“UTC”,但没有帮助。

请注意:在 Java 8 中,它可以与其他库(例如 Instant)以及除我们在 Java 7 中需要的所有库一起正常工作。

最佳答案

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

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

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

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);

输出将是:

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

如果您想继续使用FastDateFormat,也可以在其中设置时区:

FastDateFormat f = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS", TimeZone.getTimeZone("GMT" + offset));
String eventTime = f.format(timeStamp);

Java 新的日期/时间 API

旧类(DateCalendarSimpleDateFormat)有 lots of problemsdesign issues ,并且它们正在被新的 API 取代。

对于 Java 7,您可以使用 ThreeTen Backport ,Java 8 新日期/时间类的一个很好的向后移植。对于 Android,您还需要 ThreeTenABP (更多关于如何使用它 here )。

通过此功能,您可以将输入解析为 org.thirden.bp.OffsetDateTime 并使用 org. Threeten.bp.format.DateTimeFormatter 进行输出。在这种情况下,OffsetDateTime 保留偏移量信息,因此您不需要在格式化程序中设置它:

OffsetDateTime odt = OffsetDateTime.parse(string1);
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
System.out.println("timeStamp : " + odt.toInstant().toEpochMilli());
System.out.println("AfterConverting : " + odt.format(fmt));

输出是相同的:

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

关于java - 在 Java 7 中格式化 ISO 8601,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46300515/

相关文章:

java - Java 9 中的可靠配置

java - Android 如何在使用 webView 时保持屏幕打开

sql - 在转换之前验证日期,也就是。 ISDATE() 等效

mysql - 将缩写字符串格式的日期转换为mysql中的日期格式

java - 如何更改日期的 json 字符串并将其格式化为仅显示日期而不显示年、月或时间

Java:在 AbstractTableModel 中添加一行 JCombobox

javascript - Java 在缓存中保存 JSP 页面

C# 日期时间 : Conversion for different time zones

java - SimpleDateFormat 适用于 IST 时区,但不适用于 JST 时区

java - SimpleDateFormat 解析时间为一小时(使用 RFC 1123,夏季为 GMT)