首页 > 解决方案 > 从 Angular 解析日期

问题描述

我想从 Angular 解析搜索日期。我做这个查询:

[HPM] GET /api/data/find?from=2019-07-24T00:00:00.000Z&page=0&size=10 

使用https://github.com/tkaczmarzyk/specification-arg-resolver框架我想执行搜索。我treid这个配置:

@Spec(path = "createdAt", params = "from", spec = GreaterThanOrEqual.class, config="yyyy-MM-dd'T'HH:mm:ss'Z'"),
                    @Spec(path = "createdAt", params = "to", spec = LessThanOrEqual.class, config="yyyy-MM-dd'T'HH:mm:ss'Z'")

但我得到例外:

 java.time.format.DateTimeParseException: Text '2019-07-24T00:00:00.000Z' could not be parsed at index 19

你知道我需要设置什么日期格式吗?

标签: javaangulardatetimedate-formatting

解决方案


TL;博士

uuuu-MM-dd'T'HH:mm:ss.SSSX

讨论

您尝试的格式模式字符串有两个问题,yyyy-MM-dd'T'HH:mm:ss'Z'.

  1. 它不包括秒的分数。您尝试解析的字符串 ,2019-07-24T00:00:00.000Z在秒上具有三位小数,因此您需要S在格式模式字符串中指定三位。您得到指向索引 19 的异常,这正是小数点所在的位置。数数获得给定索引的方式通常很有帮助。
  2. 日期时间字符串中的尾随Z表示 UTC 或从 UTC 偏移 0。你需要这样解析它,否则你会得到一个不正确的时间(除非你的 JVM 的时区恰好与 UTC 重合,但这既模糊又脆弱,你不想依赖它)。

无论您使用yyyy还是uuuu使用一年都可能无关紧要。我在下面包含一个链接,用于讨论差异。

X使用, XX,和有区别XXX,但它们都匹配。因此,如果您的日期时间字符串总是带有一个,那么您放多少并不重要。有关详细信息,请参阅文档链接。XXXXXXXXXZZX

另一个提示:当使用某些格式模式字符串解析不起作用时,请尝试使用您正在尝试的模式格式化字符串,并查看格式化字符串与您尝试解析的字符串有何不同。它通常会给你一个提示。例如:

    DateTimeFormatter testFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
    System.out.println(LocalDate.of(2019, Month.JULY, 24).atStartOfDay(ZoneId.systemDefault()).format(testFormatter));
    System.out.println("2019-07-24T00:00:00.000Z");

在输出中,字符串之间的区别很明显:

2019-07-24T00:00:00Z
2019-07-24T00:00:00.000Z

(不过,这并没有检测到引用的错误使用'Z'。)

链接


推荐阅读