Java SimpleDateFormat时区偏移,以分号分隔冒号

时间:2013-03-06 10:51:43

标签: java simpledateformat

如何使用2012-11-25T23:50:56.193+01:00将我的日期格式化为SimpleDateFormat? 如果我以

之类的格式使用Z

yyyy-MM-dd'T'hh:mm:ss.SSSZ

然后显示

2013-03-06T11:49:05.490+0100

2 个答案:

答案 0 :(得分:35)

您可以使用 Java 7 +01:00)中的 SimpleDateFormat 获取格式为yyyy-MM-dd'T'HH:mm:ss.SSSXXX的时区偏移量Joda DateTimeFormat yyyy-MM-dd'T'HH:mm:ss.SSSZZ)。

答案 1 :(得分:2)

这是2017年的答案。如果有任何方法可以(有),抛弃过时的类SimpleDateFormat,并使用java.time中的现代和更方便的类。特别是,所需格式2012-11-25T23:50:56.193+01:00符合ISO-8601标准,因此开箱即用,只需使用OffsetDateTime.toString()

    OffsetDateTime time = OffsetDateTime.now();
    System.out.println(time.toString());

这会打印类似

的内容
2017-05-10T16:14:20.407+02:00

您可能想知道或者可能不想知道的一件事,但是它会在秒上打印多个3位小数组,以便在OffsetDateTime对象中打印精度。显然在我的电脑上“现在”的精度为毫秒(秒数为三位小数)。

如果你有一个老式的Date对象,例如,你通过调用一些遗留方法得到它,我建议你做的第一件事是将它转换为Instant,这是其中一个现代课程。从那里您可以根据您的要求轻松进行其他转换:

    Date now = new Date();
    OffsetDateTime time = now.toInstant().atZone(ZoneId.systemDefault()).toOffsetDateTime();
    System.out.println(time.toString());

我真的做了比必要更多的转换。 atZone(ZoneId.systemDefault())生成了ZonedDateTime,其toString()并不总能为您提供您想要的格式;但它很容易被格式化:

    ZonedDateTime time = now.toInstant().atZone(ZoneId.systemDefault());
    System.out.println(time.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));