Java日期字符串转换为不同的格式但具有相同的时区

时间:2018-01-29 20:34:05

标签: java simpledateformat

SimpleDateFormat from = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
SimpleDateFormat to = new SimpleDateFormat("MM/dd/yyyy Z");
Date date = from.parse("2017-08-10T00:00:00.000+0000");
String newDateStr = to.format(date);

newDateStr 08/09/2017 -0500 。我希望newDataStr可以与原始日期字符串(0000)具有相同的时区 - 08/10/2017 -0000 。我该怎么做才能做到这一点?

2 个答案:

答案 0 :(得分:3)

使用java.time(现代Java日期和时间API)更容易保留原始字符串的偏移量:

    DateTimeFormatter from = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSZ");
    DateTimeFormatter to = DateTimeFormatter.ofPattern("MM/dd/yyyy Z");
    String newDateStr = OffsetDateTime.parse("2017-08-10T00:00:00.000+0000", from)
            .format(to);
    System.out.println(newDateStr);

打印

08/10/2017 +0000

这不是建议更改为现代API的唯一原因。您使用的Date课程已经过时了,SimpleDateFormat尤其因使用起来很麻烦而闻名。我总是建议在2018年远离这些课程。现代API通常更好。由于您已经在使用Java 8,因此绝对没有理由不这样做(对于任何阅读和使用Java 6或7的人来说,新的API也已经被移植到这些Java版本中)。

出了什么问题?

旧式Date对象只是一个时间点,它不包含时区或偏移量。因此,在将字符串解析为Date后,偏移信息不再存在。因此,新格式化程序Dateto都无法知道原始字符串中的偏移量或时区。相反,新的格式化程序使用了自己的时区。由于您没有在格式化程序上明确设置时区,因此它的时区是JVM的时区,这个时区显然是2017年9月这几天与UTC相差的时区。

过时的课程有一些棘手的方法来解决问题,但正如我已经说过的那样,我不想打扰。

答案 1 :(得分:2)

您可以使用Java 8 Date API,它提供了一组很好的功能 将日期转换为字符串(包括时区支持)。

一个例子:

    ZonedDateTime dateTime = ZonedDateTime.parse("2017-08-10T00:00:00.000+0000", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"));
    String newDateStr = dateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy Z"));

有关详细信息,请查看: