将日期从JavaScript转换为Java

时间:2019-02-24 21:17:52

标签: javascript java angular

我在angular 6应用程序中具有此Date值:

expires_at: Date;

在Java getter中,我使用String来获取值:

private String expires_at;

但是当我使用以下代码进行转换时:

从字符串到LocalDateTime

terminals.setExpires_at(LocalDateTime.parse(terminalDTO.getExpires_at()));

从LocalDateTime到字符串:

terminalNewDTO.setExpires_at(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(terminals.getExpires_at()));

我收到此错误:

create] due to exception [Text '2019-02-19T01:00:00.000Z' could not be parsed, unparsed text found at index 23]
20:55:43,494 INFO  [stdout] (default task-1) java.time.format.DateTimeParseException: Text '2019-02-19T01:00:00.000Z' could not be parsed, unparsed text found at index 23
20:55:43,494 INFO  [stdout] (default task-1)    at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2049)
20:55:43,494 INFO  [stdout] (default task-1)    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
20:55:43,495 INFO  [stdout] (default task-1)    at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:492)
20:55:43,495 INFO  [stdout] (default task-1)    at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:477)
20:55:43,496 INFO  [stdout] (default task-1)    at deployment.datalis_admin.war//org.datalis.admin.backend.mapper.TerminalsMapperImpl.map(TerminalsMapperImpl.java:98)
20:55:43,496 INFO  [stdout] (default task-1)    at deployment.datalis_admin.war//org.datalis.admin.backend.restapi.TerminalController.create(TerminalController.java:104)
20:55:43,496 INFO  [stdout] (default task-1)    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
20:55:43,497 INFO  [stdout] (default task-1)    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
20:55:43,497 INFO  [stdout] (default task-1)    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
20:55:43,497 INFO  [stdout] (default task-1)    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
20:55:43,497 INFO  [stdout] (default task-1)    at deployment.datalis_admin.war//org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)

您知道我该如何解决这个问题?

这是我尝试发送的日期值:2/20/19, 3:00 AM

2 个答案:

答案 0 :(得分:13)

UTC

Z表示零时分秒的offset-from-UTC。换句话说,UTC本身。 Z的发音为“ Zulu”。

使用Instant类进行解析,该类代表UTC时刻。

Instant instant = Instant.parse( "2019-02-19T01:00:00.000Z" ) ;

该输入字符串为标准ISO 8601格式。 java.time 类使用ISO 8601格式作为解析和生成字符串的默认格式。

instant.toString() // generates a ISO 8601 string.

比UTC早两个小时

您在问题中说:

  

这是日期值:2/20/19,3:00 AM

如果原始值为3 AM,则显然是在UTC之前两个小时的时区中。正如您在list in Wikipedia中所看到的,这可能是多个时区中的任何一个(请注意,该列表可能不是最新的)。

我会随身带着Africa/Tripoli

ZoneId z = ZoneId.of( "Africa/Tripoli" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;  // Adjust from UTC to a time zone. Same moment, same point on the timeline, different wall-clock time.

instantzdt代表时间轴上的同一时刻,同一同时点。通过两个不同地区的人民使用的挂钟时间可以看到这一时刻。

想象一下,利比亚的某个人叫冰岛的某人。聊天时,他们俩都抬头看着各自墙上的时钟。 Iceland clocks使用与UTC的偏移量为零,而in Libya则比UTC早两个小时。因此,利比亚的凌晨3点是冰岛的凌晨1点。

请参阅此code run live at IdeOne.com

  

instant.toString():2019-02-19T01:00:00Z

     

zdt.toString():2019-02-19T03:00 + 02:00 [非洲/的黎波里]

LocalDateTime类暂时不是

  

从LocalDateTime到字符串:

跟踪时刻时切勿使用LocalDateTimeLocalDateTime仅仅是日期和时间,仅此而已。如果没有时区或从UTC偏移的上下文,则LocalDateTime不能代表一个时刻。它表示大约26-27小时范围内的潜在时刻,这是全球各地时区的当前范围。

LocalDateTime就像是说“今年1月23日中午”。您是在日本东京或印度加尔各答(印度)中午吗?或者也许是法国巴黎?蒙特利尔魁北克省?这些地方的中午发生在不同的时刻,每个时刻之间经过了几个小时。

LocalDateTime中的“本地”表示任何本地,或每个本地,但是不是表示任何特殊的位置。


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:1)

您还可以使用:

String expires_at = "2/20/19, 3:00 AM";
SimpleDateFormat parser = new SimpleDateFormat("MM/dd/yyyy, h:mm a"); 
Date date = parser.parse(expires_at);