将日期从JavaScript转换为Java

将日期从JavaScript转换为Java,javascript,java,angular,Javascript,Java,Angular,我在angular 6应用程序中有此日期值: expires_at: Date; 在Java getter中,我使用字符串获取值: private String expires_at; 但当我使用此代码转换时: 从字符串到LocalDateTime terminals.setExpires_at(LocalDateTime.parse(terminalDTO.getExpires_at())); 从LocalDateTime到字符串: terminalNewDTO.setExpires_a

我在angular 6应用程序中有此日期值:

expires_at: Date;
在Java getter中,我使用字符串获取值:

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

UTC
Z
表示零小时分秒。换言之,就是它本身。
Z
发音为“Zulu”

使用
Instant
类进行分析,该类表示UTC中的一个时刻

Instant instant = Instant.parse( "2019-02-19T01:00:00.000Z" ) ;
该输入字符串采用标准ISO 8601格式。time类使用ISO 8601格式,默认情况下解析和生成字符串

instant.toString() // generates a ISO 8601 string.
UTC前两小时 你在问题中说:

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

如果原始值为凌晨3点,显然它位于UTC前两小时的时区。这可能是几个时区中的任意一个,正如您在本文中看到的(注意,该列表可能不是最新的)

我将随意选择
非洲/的黎波里

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.
instant
zdt
都代表了非常相同的时刻,即时间线上相同的同时点。这一时刻是通过两个不同地区的人民使用的挂钟时间来看待的

想象一下利比亚有人给冰岛人打电话。他们一边聊天,一边抬头看着各自墙上的时钟。当它们比UTC早两小时时,使用与UTC的偏移量为零。所以利比亚的凌晨3点是冰岛的凌晨1点

看这个

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

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

LocalDateTime
类暂时不可用 从LocalDateTime到字符串:

terminalNewDTO.setExpires_at(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(terminals.getExpires_at()));
跟踪时刻时,切勿使用
LocalDateTime
LocalDateTime
只是一天中的一个日期和时间,仅此而已。如果没有时区或UTC偏移量的上下文,则
LocalDateTime
不能表示一个时刻。它代表了大约26-27小时范围内的潜在时刻,即目前全球时区的范围

A
LocalDateTime
就像说“今年1月23日中午”。你是说日本东京的中午还是印度加尔各答的中午?或者法国巴黎?魁北克山?在这些不同的地方,中午发生在不同的时刻,每一个时间间隔都有几个小时

LocalDateTime
中的“Local”表示任何位置或每个位置,但表示任何特定位置


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

该项目现已启动,建议迁移到类

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

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android(),您还可以使用:

      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); 
      

      你在用“Z”来表示“祖鲁时间”/“UTC?我不知道。这是从日期选择器来的。你可以用
      OffsetDateTime date=OffsetDateTime.parse(“2019-02-19T01:00:00.000Z”,DateTimeFormatter.ISO_OFFSET_date_time)
      我不相信您从最近编辑中添加的第二行代码中获得相同的stacktrace。请为每行代码引用准确的stacktrace(或在新版本中发布新问题)。OneLiner ~
      ZonedDateTime.parse(“2019-02-19T01:00:00.000Z”,DateTimeFormatter.ISO_ZONED_DATE_TIME”)。toLocalDateTime()
      @PeterPenzov我添加了一个代码示例。仅供参考,这个问题已经在堆栈溢出问题上解决了很多次。发布前搜索,并搜索更详细的讨论和更多示例。请在我的代码中告诉我如何使用您的解决方案,好吗?我想快速修复方法应该是
      terminals.setExpires\u at(LocalDateTime.parse)(terminalDTO.getExpires\u at(),DateTimeFormatter.ISO\u OFFSET\u DATE\u TIME))如果你可以使用<代码>即时或<代码> OffStaseDeTime< /Code >而不是在App中使用 LoalDATeTime/Code >。结果我有一个案例。代码被更新了。我想这里还有很多要想的。最好在ANGALR TS中使用一个数据表,并将日期转换为标准格式的应用程序。始终期待。使用Instant.parse()仅适用于ISO_即时格式(您当前的情况)。如果您的UI中的格式发生任何变化,代码将在后端中断。最好的方法是始终对服务数据使用UTC时间戳。