【问题标题】:Java - long time to ISO_8601 string formatJava - ISO_8601 字符串格式很长时间
【发布时间】:2014-12-31 10:54:00
【问题描述】:
我想将 long 日期转换为 ISO_8601 字符串。
例如:
2014-11-02T20:22:35.059823+01:00
我的代码
long timeInLong=System.currentTimeMillis();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String fmm = df.format(new java.util.Date(timeInLong));
System.out.println(fmm);
这将显示在我的控制台中
2014-11-04T15:57+0200
我想我想得到它
2014-11-04T15:57+02:00
我该怎么做? (不带字符串函数)
【问题讨论】:
标签:
java
date
time
date-format
simpledateformat
【解决方案1】:
在 Java 7 或更高版本上使用 SimpleDateFormat
格式字符串中的时区使用XXX,而不是Z:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmXXX");
如果您使用的是 Java 7 或更高版本,则此方法有效。
Java 版本 6 或更早版本
对于旧版本的 Java,您可以使用 javax.xml.bind.DatatypeConverter 类:
import javax.xml.bind.DatatypeConverter;
// ...
Calendar cal = Calendar.getInstance();
cal.setTime(new java.util.Date(timeInLong));
System.out.println(DatatypeConverter.printDateTime(cal));
请注意,这会增加毫秒数,因此输出将是例如 2014-11-04T15:49:35.913+01:00 而不是 2014-11-04T15:49:35+01:00(但这无关紧要,因为这仍然是有效的 ISO-8601 格式)。
Java 8 或更新版本
如果您使用的是 Java 8,那么最好使用新的 java.time API 而不是 java.util.Date:
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.ofEpochMilli(timeInLong),
ZoneId.systemDefault());
System.out.println(zdt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));