将日期从JavaScript转换为Java - javascript

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

expires_at: Date;

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

private String expires_at;

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

从字符串到LocalDateTime

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

从LocalDateTime到String:

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

参考方案

世界标准时间
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到String:

跟踪时刻时切勿使用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-Time中的maintenance mode项目建议迁移到java.time类。

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

在哪里获取java.time类?

  • Java SE 8Java SE 9Java SE 10Java SE 11和更高版本-具有捆绑实施的标准Java API的一部分。
  • Java 9添加了一些次要功能和修复。
  • Java SE 6Java SE 7
  • 大部分java.time功能都在ThreeTen-Backport中反向移植到Java 6和7。
  • Android
  • 更高版本的java.time类的Android捆绑实现。
  • 对于早期的Android(<26),ThreeTenABP项目改编了ThreeTen-Backport(如上所述)。参见How to use ThreeTenABP…
  • ThreeTen-Extra项目使用其他类扩展了java.time。该项目是将来可能向java.time添加内容的试验场。您可能会在这里找到一些有用的类,例如 IntervalYearWeekYearQuarter 和more。

    Java / Javascript-从客户端获取IP - java

    我正在使用java playframework2,但似乎无法获得正确的IP地址。每次请求后,它都会不断变化。我的意思是,流量分析网站在标头中实现javascript来分析您的流量,因此使用javascript应该可以吗?如果框架不提供此类功能,是否还有其他方法可以从客户端获取IP?我想建立一个访客计数器,但是它应该只统计唯一身份的访客。也许我不必使用IP地址…

    用于客户端通知的AMQP或XMPP - java

    我正在设计一个自定义消息传递系统的替代品,该系统目前用于从服务器端(Java)通知JavaScript Web应用程序有关更改的内容。该旧版消息传递系统通过使用基于自定义文本的协议和纯Java套接字,通过Flash XMLSocket进行工作。替换将不仅由Web应用程序(通过Web套接字而不是Flash)使用,而且还将由用C#编写的其他桌面客户端应用程序使用…

    需要登录后才能访问网址 - javascript

    好的,所以我对如何解决这个问题感到非常困惑。我有一个名为“ index.html”的主页。它具有一个说“创建帐户”的按钮,该按钮允许您创建一个帐户;如果您已经有一个帐户,则另一个按钮可以链接到登录页面。登录帐户后,您会进入一个名为“ browse.html”的页面,在这里您可以观看所有可以观看的电影。我只是想不通如何将尝试访问URL的人从URL重定向到登录页…

    javascript popupwindow之后的行如何工作? - javascript

    好的,我有一个来自后面代码的方法,可以创建一个popupwindow。然后有一行代码要在那之后执行,我想知道那行代码何时执行,是在使用popupwindow之后执行还是在创建popupwindow之后执行?例如:void exPopupWindowMethod() { string scr = "window.open('exampleP…

    想要在Java中发送十六进制字符串数据 - java

    我在char []数组中有Integer数据。例如:12、03、10。我想以十六进制格式以字符串形式发送数据。例如:0C030A但是转换为十六进制后,我得到的是C3A。请建议我将正确的数据作为0C030A。我正在使用以下代码String messageBody = "A3"; SimpleDateFormat sdf = new Simp…