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 。我该怎么做才能做到这一点?
答案 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
后,偏移信息不再存在。因此,新格式化程序Date
和to
都无法知道原始字符串中的偏移量或时区。相反,新的格式化程序使用了自己的时区。由于您没有在格式化程序上明确设置时区,因此它的时区是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"));
有关详细信息,请查看: