【问题标题】:how to convert time in miliseconds to timeInSeconds and offsetInNanos?如何将时间以毫秒为单位转换为时间秒和 offsetInNanos?
【发布时间】:2020-04-28 18:17:55
【问题描述】:

我有这个函数可以将日期的字符串类型转换为unix时间戳,如何将结果转换为timeInSeconds和offsetInNanos

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
                "yyyy-MM-dd-HH-mm-ss");
        String dateTimeString = "2016-06-21-10-19-22";
        LocalDate date = LocalDate.parse(dateTimeString, formatter);
        ZonedDateTime resultado = date.atStartOfDay(ZoneId.of("UTC"));

        Instant i = resultado.toInstant();
        long timeInSeconds = i.getEpochSecond();
        int nanoAdjustment = i.getNano();

        System.out.println("" + timeInSeconds + " seconds " + nanoAdjustment + " nanoseconds");

result is 1466467200 seconds 0 nanoseconds
but the correct answer seems to be 1466504362 seconds

【问题讨论】:

  • 将时间以毫秒为单位转换为 timeInSeconds:除以 1000。
  • 要转换为 offsetInNanos,必须知道时区。问题代码中的Z 和UTC 都指定偏移量为0,因此没有什么要转换的。 getTime() 自 UTC 纪元以来始终返回毫秒。
  • 使用java.time并使用ZonedDateTime解析String,将其转换为Instant,您可以使用getEpochSecond()和getNano()...
  • @deHaar 为什么不直接使用Instant.parse("2013-09-29T18:46:19Z")?为什么要绕道ZonedDateTime?
  • @Andreas 当然,这将是直接的方式......

标签: java


【解决方案1】:

编辑

result is 1466467200 seconds 0 nanoseconds
but the correct answer seems to be 1466504362 seconds

我认为它将“2016-06-21-10-19-22”转换为 2016-06-21T00:00:00+00:00, 如何解决这个问题,将日期转换为时间和日期 没有时间纠正 timeInSeconds?

你是绝对正确的,这就是它的作用,这是因为在你的问题中你的新代码

  1. 仅解析日期部分。您正在解析为 LocalDate,这是一个没有时间的日期,因此字符串中的时间将被忽略。
  2. 然后调用atStartOfDay()。这确保一天中的时间设置为 - 正如方法名称所说 - 一天的开始,在本例中为 UTC,因此为 00:00:00 UTC。

解决方法:改为解析为LocalDateTime,这样您就可以同时获得日期和时间。

    LocalDateTime date = LocalDateTime.parse(dateTimeString, formatter);
    OffsetDateTime resultado = date.atOffset(ZoneOffset.UTC);

其余代码相同。现在的输出是:

1466504362 秒 0 纳秒

这是您所说的预期结果。虽然 ZonedDateTime 也可以使用,但对于 UTC 来说,这有点矫枉过正,我建议您使用 OffsetDateTime,正如我所展示的那样。

有关如何解析可能包含或不包含一天中时间的字符串,请参阅我在底部链接到的一些问题。

原答案:java.time

我想以纳秒为单位的偏移是指纳秒调整、纳秒部分或纳秒(不是从 UTC 偏移)。使用现代 Java 日期和时间 API java.time,这很简单:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            "MMM dd yyyy HH:mm:ss.SSS zzz", Locale.ENGLISH);
    String dateTimeString = "Jun 13 2003 23:11:52.454 UTC";
    Instant i = ZonedDateTime.parse(dateTimeString, formatter)
            .toInstant();
    long timeInSeconds = i.getEpochSecond();
    int nanoAdjustment = i.getNano();

    System.out.println("" + timeInSeconds + " seconds " + nanoAdjustment + " nanoseconds");

输出是:

1055545912 秒 454000000 纳秒

我只是按照 deHaar 在 cmets 中所说的做了。

链接

【讨论】:

  • 嗨 Ole V.V.,我编辑了我的代码来解析日期,但结果似乎错误,问题是什么
  • @Ole V.V.我认为它将“2016-06-21-10-19-22”转换为 2016-06-21T00:00:00+00:00,如何解决这个问题,将日期与时间和日期都转换为更正timeInSeconds?
  • 感谢您的帮助。
猜你喜欢
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 2017-05-28
  • 1970-01-01
相关资源
最近更新 更多