使用Java将纪元时间和当前时刻之间的经过时间转换为ISO 8601持续时间

时间:2018-05-08 09:23:35

标签: java datetime duration epoch

自1970年1月1日UTC(大纪元时间)以来,我有几毫秒。

1512431637067

我需要将其转换为类似(ISO-8601持续时间)。这将基于今天的当前日期。

P5M4D

任何想法如何使用java代码以简单的方式做到这一点?

3 个答案:

答案 0 :(得分:3)

ZoneId zone = ZoneId.of("Europe/Guernsey");  // Specify a time zone by proper name `Contintent/Region`, never by 3-4 letter codes such as `PST`, `CST`, or `IST`.
LocalDate then =                             // Represent a date-only value, without time zone and without time-of-day.
    Instant.ofEpochMilli(1_512_431_637_067L) // Parse your number of milliseconds since 1970-01-01T00:00Z as a value in UTC.
           .atZone(zone)                     // Adjust from UTC to some other zone. Same moment, different wall-clock time. Returns a `ZonedDateTime`.  
           .toLocalDate();                   // Extract a date-only value.
LocalDate today = LocalDate.now(zone);       // Get the current date as seen in the wall-clock time in use by the people of a particular region.
Period diff = Period.between(then, today);   // Determine the number of years-months-days elapsed.
System.out.println(diff);                    // Generate a String is standard ISO 8601 format: `PnYnMnDTnHnMnS`.

刚刚运行时的输出正是您所要求的:

  

P5M4D

结果取决于时区。对于任何特定时刻,日期在全球范围内因地区而异。

因此,如果不是Europe/Guernsey,请替换您所需的时区。如果您希望在ZoneOffset.UTC中进行计算,请使用OffsetDateTimeUTC课。

例如,为Europe/Guernsey运行上面的代码会导致P5M4D,而切换到Europe/Moscow会产生P5M3D,相差一天,具体取决于您指定的区域。

Period.between(then, LocalDate.now(ZoneId.of("Europe/Moscow")))

提出问题当天的输出是:

  

P5M3D

对于包含大于一天的单位的持续时间,您需要使用java.time ............................... @Injectable() export class ApiBaseService { ............................... constructor(url : string, _logger : LoggerService) { ............................... } ............................... Period类适用于较小的单位,日 - 小时 - 分 - 秒 - 毫微秒。

答案 1 :(得分:1)

严格地说,你不能因为所谓的'#ep;时代"真的是一个瞬间,而不是一个持续时间。但您可能希望将该时期(Unix纪元)以来的经过时间建模为持续时间。所以你走了:

System.out.println(Duration.of(1512431637067L, ChronoUnit.MILLIS));
// output: PT420119H53M57.067S

方法java.time.Duration.toString()自动将秒和纳秒标准化为HMS格式(否则我们必须声明新持续时间类的打印功能是有限的)。如果您希望更多地控制ISO格式,请使用toHours()等方法考虑自己的解决方法,或使用第三方库进行持续时间打印。

另一件事:1512431637067似乎是以毫秒为单位,而不是几秒钟,因为你声明否则你会在不久的将来得到一个瞬间:

System.out.println(Instant.ofEpochMilli(1512431637067L));
// output: 2017-12-04T23:53:57.067Z

System.out.println(Instant.ofEpochSecond(1512431637067L));
// far future: +49897-01-18T19:11:07Z

答案 2 :(得分:0)

试试这一行

11As7737Cs9ue9oo09

iso 8601上的输出日期:

import java.util.Date; import java.text.SimpleDateFormat; import java.text.DateFormat; import java.util.Locale; public class HelloWorld { public static void main(String[] args) { Date date=new Date (1512431637067L); DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX", Locale.US); System.out.print(df.format(date)); } }