在一个api调用中,我收到的时间戳是:1591290491238。我需要把它转换成java中的localdatetime。我将代码编写为:
String timestamp = "1584453053825";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMdduuHHmmss");
LocalDateTime localDateTime = LocalDateTime.parse( timestamp , formatter );
但它抛出了一个错误:
Text '1584453053825' could not be parsed at index 12
3条答案
按热度按时间cld4siwp1#
该数字表示unix的时间,即自epoch(即1970年1月1日午夜utc)以来经过的毫秒数。
你可以把它转换成
LocalDateTime
这样地:6ju8rftf2#
使用ZoneDateTime作为日期和时间
时间戳是自1970年1月1日java/unix纪元以utc为单位的一天开始以来的毫秒数。要将它转换为一天中的日期和时间,首先需要为它确定一个时区,因为在所有时区中它都不是同一个时间(甚至不是同一个日期)。只要计数大于1000,java就直接解析包含它的字符串。
此示例代码段的输出为:
2020-06-04t13:08:11.238-04:00[美国/纽约]
正如巴兹尔布尔克在评论中所说,
LocalDateTime
对你的日期和时间来说是错误的课程。ZonedDateTime
由于它还包含时区,因此定义了原始时间戳字符串定义的时间点,因此提供了相同的和更多的信息。你可以改成LocalDateTime
从而丢弃了你想要保留的信息。所以只有在你需要帮助的时候才去做LocalDateTime
对于一个api设计的人谁不明白这是错误的类。2020-06-04t13:08:11.238
您注意到我们现在已经失去了utc和时区的偏移量。
你的代码哪里出错了?
您尝试使用
MMdduuHHmmss
. 模式定义了12个数字,但字符串中有13个。您使用的模式假设1591290491238是指2090年第159个月的第12天,在24小时制的49:12:38,或者类似的时间。这是胡说八道。也因为,如我所说,数字指的是一个时间点,而不是日期和时间,要获得后者,我们首先需要提供一个时区。2lpgd9683#
您的时间戳实际上是从
1970-01-01T00:00:00Z
哪里Z
代表Zulu
日期时间或日期时间(utc)(即时区偏移为+00:00
小时)。你应该把它解析成long
然后拿到Instant
从它那里。一旦你有了目标
Instant
,您可以从中获取其他日期时间类型的对象,如下所示:输出:
从trail:date-time了解现代日期时间api。