首页 > 解决方案 > 在 angularJs 视图中格式化 Java 8 LocalDateTime

问题描述

我正在使用带有 angularJs UI 的 spring boot,我的应用程序传递java.time.LocalDateTime到 anular 视图。

我正在尝试使用angularjs's 日期过滤器,如下所示:

{{ localDateTime | date : 'yyyy/MM/dd hh:mm:ss' }}

但它不起作用。输出如下所示:

{"dayOfMonth":8,"dayOfWeek":"FRIDAY","dayOfYear":39,"month":"FEBRUARY","year":2019,"monthValue":2,"hour":14,"minute":48,"nano":87000000,"second":24,"chronology":{"id":"ISO","calendarType":"iso8601"}}

我什至也尝试按照这里application.property的建议添加。它仍然显示在 JSON 之上。有人可以帮忙吗。

标签: angularjsspring-bootjava-8

解决方案


问题是默认情况下 Jackson 不知道如何将 Java 8 日期结构 ( JSR 310 ) 正确序列化为 JSON。结果,它返回一个包含dayOfMonth, dayOfWeek, ... 的整个对象结构,正如您所观察到的。

一种解决方案是将您的日期序列化为众所周知的格式,例如 ISO-8601 字符串。为此,您首先必须通过添加以下依赖项来添加对这些 Java 8 类型的支持:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

之后,您应该注意到您的日期被序列化为一个数组,例如:

[2019, 2, 8, 11, 0, 0, 0, 0]

这是一个包含年、月日等的数组。但是,AngularJS 日期过滤器还不能使用这些结果。正确的解决方案是将它们格式化为没有时区的 ISO-8601 字符串(考虑到它是 a LocalDateTime)。您可以通过在application.propertiesWRITE_DATES_AS_TIMESTAMPS中配置以下属性来禁用 Jackson 中的序列化功能:

spring.jackson.serialization.write-dates-as-timestamps=false

现在您的日期将被格式化为字符串,例如:

"2019-02-08T11:00:00.000"

如果您查看AngularJS 日期过滤器的文档,您会发现它得到了适当的支持:

将日期格式化为 Date 对象、毫秒(字符串或数字)或各种 ISO 8601 日期时间字符串格式(例如 yyyy-MM-ddTHH:mm:ss.sssZ 及其较短的版本,如 yyyy-MM-ddTHH:mmZ、yyyy-MM -dd 或 yyyyMMddTHHmmssZ)。

请注意,由于您使用的是LocalDateTime,因此没有给出时区信息,因此,AngularJS 日期过滤器认为这是本地浏览器时间,如同一文档中所述:

如果在字符串输入中未指定时区,则时间被认为是本地时区。

这意味着如果服务器时区与浏览器时区不同,给定时间就会出现问题。


推荐阅读