我在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
。
答案 0 :(得分:13)
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.
您在问题中说:
这是日期值: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.
instant
和zdt
代表时间轴上的同一时刻,同一同时点。通过两个不同地区的人民使用的挂钟时间可以看到这一时刻。
想象一下,利比亚的某个人叫冰岛的某人。聊天时,他们俩都抬头看着各自墙上的时钟。 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到字符串:
跟踪时刻时切勿使用LocalDateTime
。 LocalDateTime
仅仅是日期和时间,仅此而已。如果没有时区或从UTC偏移的上下文,则LocalDateTime
不能代表一个时刻。它表示大约26-27小时范围内的潜在时刻,这是全球各地时区的当前范围。
LocalDateTime
就像是说“今年1月23日中午”。您是在日本东京或印度加尔各答(印度)中午吗?或者也许是法国巴黎?蒙特利尔魁北克省?这些地方的中午发生在不同的时刻,每个时刻之间经过了几个小时。
LocalDateTime
中的“本地”表示任何本地,或每个本地,但是不是表示任何特殊的位置。
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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);