在java中格式化日期时出错

xesrikrc  于 2021-06-27  发布在  Java
关注(0)|答案(4)|浏览(492)

这个问题在这里已经有了答案

datetimeparse异常(1个答案)
9天前关门了。
我尝试了几种方法,包括javajoda-time、date-time-with-locale和commons-lang,但无法格式化这个日期。

输入 Mon Dec 28 15:18:16 UTC 2020 ##输出

所需输出格式 yyyy-MM-dd HH:mm:ss.SSS 当我使用像 EEE MMM dd HH:mm:ss Z YYYY 日期离我还有几天,时区似乎完全错了。
格式化程序:

private static final DateTimeFormatter DATE_TIME_FORMATTER =
    DateTimeFormatter
      .ofPattern("yyyy-MM-dd HH:mm:ss.SSS")
      .withLocale(Locale.US)
      .withZone(ZoneId.systemDefault());
DateUtils.parseDate (Optional
        .ofNullable(record)
        .map(CustomerModel::getCustomerAudit)
        .map(customerAudit::getCreated)
        .map(auditItem::getDate).get ().toString (), "EEE MMM dd HH:mm:ss YYYY")
llew8vvj

llew8vvj1#

对我来说很好。

String s = "Mon Dec 28 15:18:16 UTC 2020";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss VV yyyy",
                                                          Locale.ENGLISH);
ZonedDateTime zdt = ZonedDateTime.parse(s, formatter);
formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS", Locale.ENGLISH);
System.out.println(zdt.format(formatter));

输出为

2020-12-28 15:18:16.000

我错过什么了吗?

b91juud3

b91juud32#

在调试解析问题时,如果可能,请反转操作并生成要解析的文本,以验证解析规则,即日期格式字符串。这适用于日期解析、jaxb解析和任何其他双向(反)序列化操作。它使查找转换规则问题变得更加容易。
那么,让我们检查问题中的格式字符串,以及显示的日期值:

ZonedDateTime dateTime = ZonedDateTime.of(2020, 12, 28, 15, 18, 16, 0, ZoneOffset.UTC);
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss Z YYYY", Locale.US);
System.out.println(dateTime.format(fmt));

输出

Mon Dec 28 15:18:16 +0000 2021

哎呀!这不符合预期的输出,即我们希望解析的输入:

Mon Dec 28 15:18:16 UTC 2020

出什么事了?
这一年错了,因为它应该是 uuuu (年),不是 YYYY (基于周的年份)。
时区错了,因为 Z 不支持文本表示。使用 VV 或者 z 相反。

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z uuuu", Locale.US);

ZonedDateTime dateTime = ZonedDateTime.parse("Mon Dec 28 15:18:16 UTC 2020", fmt);
System.out.println(dateTime);
System.out.println(dateTime.format(DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS")));

输出

2020-12-28T15:18:16Z[UTC]
2020-12-28 15:18:16.000

如您所见,它现在被正确地解析了。

jbose2ul

jbose2ul3#

问题中的代码没有什么意义:
它正在格式化一个 Date 值到文本使用 toString() ,只是想把它解析回去。
它正在使用 Optional 对于简单的空处理(这是不鼓励的),但是无条件调用 get() ,意思是 null 值仍将引发异常。
代码应为:

record.getCustomerAudit().getCreated().getDate().toInstant()

这当然使整个问题毫无意义。

wbgh16ku

wbgh16ku4#

你试过simpledateformat吗?

String dateString = "Mon Dec 28 15:18:16 UTC 2020";

SimpleDateFormat input = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
SimpleDateFormat output = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.ENGLISH);

System.out.println(output.format(input.parse(dateString)));

时区:

String dateString = "Mon Dec 28 15:18:16 UTC 2020";

SimpleDateFormat input = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
SimpleDateFormat output = new SimpleDateFormat("yyyy-MM-dd z HH:mm:ss.SSS");
input.setTimeZone(TimeZone.getTimeZone("UTC"));
output.setTimeZone(TimeZone.getTimeZone("UTC"));

System.out.println(output.format(input.parse(dateString)));

相关问题