将数字格式的时间戳转换为java中的localdatetime

xdnvmnnf  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(633)

在一个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
cld4siwp

cld4siwp1#

该数字表示unix的时间,即自epoch(即1970年1月1日午夜utc)以来经过的毫秒数。
你可以把它转换成 LocalDateTime 这样地:

LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(timestamp)), ZoneId.systemDefault());
6ju8rftf

6ju8rftf2#

使用ZoneDateTime作为日期和时间

时间戳是自1970年1月1日java/unix纪元以utc为单位的一天开始以来的毫秒数。要将它转换为一天中的日期和时间,首先需要为它确定一个时区,因为在所有时区中它都不是同一个时间(甚至不是同一个日期)。只要计数大于1000,java就直接解析包含它的字符串。

ZoneId zone = ZoneId.of("America/New_York");
    DateTimeFormatter numericalFormatter = new DateTimeFormatterBuilder()
            .appendValue(ChronoField.INSTANT_SECONDS, 1, 19, SignStyle.NEVER)
            .appendValue(ChronoField.MILLI_OF_SECOND, 3)
            .toFormatter()
            .withZone(zone);

    String timestamp = "1591290491238";

    ZonedDateTime dateTime = ZonedDateTime.parse(timestamp, numericalFormatter);

    System.out.println(dateTime);

此示例代码段的输出为:
2020-06-04t13:08:11.238-04:00[美国/纽约]
正如巴兹尔布尔克在评论中所说, LocalDateTime 对你的日期和时间来说是错误的课程。 ZonedDateTime 由于它还包含时区,因此定义了原始时间戳字符串定义的时间点,因此提供了相同的和更多的信息。你可以改成 LocalDateTime 从而丢弃了你想要保留的信息。所以只有在你需要帮助的时候才去做 LocalDateTime 对于一个api设计的人谁不明白这是错误的类。

LocalDateTime amputatedDateTime = dateTime.toLocalDateTime();
    System.out.println(amputatedDateTime);

2020-06-04t13:08:11.238
您注意到我们现在已经失去了utc和时区的偏移量。

你的代码哪里出错了?

您尝试使用 MMdduuHHmmss . 模式定义了12个数字,但字符串中有13个。您使用的模式假设1591290491238是指2090年第159个月的第12天,在24小时制的49:12:38,或者类似的时间。这是胡说八道。也因为,如我所说,数字指的是一个时间点,而不是日期和时间,要获得后者,我们首先需要提供一个时区。

2lpgd968

2lpgd9683#

您的时间戳实际上是从 1970-01-01T00:00:00Z 哪里 Z 代表 Zulu 日期时间或日期时间(utc)(即时区偏移为 +00:00 小时)。你应该把它解析成 long 然后拿到 Instant 从它那里。
一旦你有了目标 Instant ,您可以从中获取其他日期时间类型的对象,如下所示:

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String timestamp = "1584453053825";
        long epochMilli = Long.parseLong(timestamp);
        Instant instant = Instant.ofEpochMilli(epochMilli);

        // Convert instant to ZonedDateTime with the time zone of JVM
        ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());

        // Get LocalDateTime from instant
        LocalDateTime ldt = zdt.toLocalDateTime();

        // Display ldt in the default format i.e. the value returned by ldt#toString
        System.out.println(ldt);

        // Display ldt in a custom format e.g. EEE MMMM dd, uuuu hh:mm:ss a
        System.out.println(ldt.format(DateTimeFormatter.ofPattern("EEE MMMM dd, uuuu hh:mm:ss a", Locale.ENGLISH)));
    }
}

输出:

2020-03-17T13:50:53.825
Tue March 17, 2020 01:50:53 PM

从trail:date-time了解现代日期时间api。

相关问题