将日期从JavaScript转换为Java
我在angular 6应用程序中有此日期值:将日期从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
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小时范围内的潜在时刻,即目前全球时区的范围
ALocalDateTime
就像说“今年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?我不知道。这是从日期选择器来的。你可以用
我不相信您从最近编辑中添加的第二行代码中获得相同的stacktrace。请为每行代码引用准确的stacktrace(或在新版本中发布新问题)。OneLiner ~OffsetDateTime date=OffsetDateTime.parse(“2019-02-19T01:00:00.000Z”,DateTimeFormatter.ISO_OFFSET_date_time)
@PeterPenzov我添加了一个代码示例。仅供参考,这个问题已经在堆栈溢出问题上解决了很多次。发布前搜索,并搜索更详细的讨论和更多示例。请在我的代码中告诉我如何使用您的解决方案,好吗?我想快速修复方法应该是ZonedDateTime.parse(“2019-02-19T01:00:00.000Z”,DateTimeFormatter.ISO_ZONED_DATE_TIME”)。toLocalDateTime()
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时间戳。