Java - 长时间使用ISO_8601字符串格式

Bol*_*aul 3 java time date date-format simpledateformat

我想将long中的日期转换为ISO_8601字符串.

例如:

2014-11-02T20:22:35.059823+01:00
Run Code Online (Sandbox Code Playgroud)

我的代码

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);
Run Code Online (Sandbox Code Playgroud)

这将显示在我的控制台中

2014-11-04T15:57+0200
Run Code Online (Sandbox Code Playgroud)

我想我想得到它

2014-11-04T15:57+02:00
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?(没有字符串函数)

Jes*_*per 9

在Java 7或更高版本上使用SimpleDateFormat

使用XXX的格式字符串,而不是时区Z:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmXXX");
Run Code Online (Sandbox Code Playgroud)

如果您使用的是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));
Run Code Online (Sandbox Code Playgroud)

请注意,这将增加毫秒数,因此输出将是例如2014-11-04T15:49:35.913+01:00而不是2014-11-04T15:49:35+01:00(但这应该无关紧要,因为这仍然是有效的ISO-8601格式).

Java版本8或更高版本

如果您使用的是Java 8,那么最好使用新的java.timeAPI而不是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));
Run Code Online (Sandbox Code Playgroud)