java 秒内的 ISO8601 格式

ISO8601 format in java given seconds

如何在 ISO8601 中获取 Java 中的字符串,给定自纪元以来的秒数?我在任何地方都找不到它。

我希望格式如下所示: 2000-06-31T19:22:15Z

仅使用 Date d = new Date(# of milliseconds from my # of seconds)给我一个 1970 年的日期,而我应该在 2000 年得到一些东西。

    Instant start = Instant.now() ;
    Instant stop = start.plusSeconds( 135L ) ;

    Duration d = Duration.between( start , stop ) ;

    long minutesPart = d.toMinutes(); 
    long secondsPart = d.minusMinutes( minutesPart ).getSeconds() ;

    System.out.println( "Interval: " + start + "/" + stop );
    );

我认为这段代码将帮助您获得如下内容:2000-06-31T19:22:15Z。

您可能遇到的主要问题是 2000 年 6 月只有 30 天。话虽这么说,而不是使用 Date,您可以使用 LocalDateTimeLocalDateTime.ofEpochSecond(long, int, ZoneOffset),例如

long epochSecond = 962392935L;
int nanoOfSecond = 0;
ZoneOffset offset = ZoneOffset.UTC;
LocalDateTime ldt = LocalDateTime.ofEpochSecond(epochSecond, nanoOfSecond, offset);
System.out.println(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'").format(ldt));

这应该是您需要看到的全部内容

2000-06-30T19:22:15Z

这是喜欢您请求的输出。

tl;博士

Instant.ofEpochSeconds( 962_392_935L )  // Convert from a count of whole seconds since 1970-01-01T00:00Z.
       .toString()                      // Generate a string in standard ISO 8601 format.

2000-06-30T19:22:15Z

详情

其他答案不必要地复杂。

Instant class 表示 UTC 时间轴上的一个点,分辨率为纳秒。

Instant.now()  // Current moment in UTC.

如果您有自 UTC 1970 年第一时刻的纪元参考日期 1970-01-01T00:00Z 以来的秒数,则只需使用 Instant.ofEpochSecond 工厂方法。

Instant instant = Instant.ofEpochSeconds( mySeconds ) ;

要生成标准 ISO 格式的字符串,只需调用 Instant::toString

String output = instant.toString() ;

2000-06-30T19:22:15Z

go the other direction,同时将您示例的 6 月 31 日错误更正为 6 月 30 日,正如 Elliott Frisch 所指出的:

long secondsSinceEpoch = Instant.parse( "2000-06-30T19:22:15Z" ).toEpochSecond() ;  // Gets the number of seconds from the Java epoch of 1970-01-01T00:00:00Z.

962392935

避免遗留日期时间class总是

不要使用麻烦的旧日期时间 classes,例如 Date。它们完全被 java.time class 内置于 Java 8 及更高版本中。

为了你的目的避免LocalDateTime

在本页其他地方看到的使用 LocalDateTime class 的建议是不明智的。

class 故意缺少任何时区或与 UTC 的偏移量的概念。因此,这个 class 而不是 代表时间轴上的特定点。您将丢弃有关您在 UTC 中的价值的重要信息。