这个问题在这里已有答案:
考虑到自纪元以来的秒数,我如何在ISO8601中获得Java中的字符串?我无法在任何地方找到它。
我希望格式看起来像这样:2000-06-31T19:22:15Z
仅使用日期d =新日期(从我的秒数开始的毫秒数)给我一个1970年的日期,那时我应该在2000年得到一些东西。
你可能遇到的主要问题是,2000年6月只有30天。这是说而不是使用Date
,你可以使用LocalDateTime
与LocalDateTime.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
这就像你要求的输出。
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
类表示UTC时间轴上的一个点,分辨率为纳秒。
Instant.now() // Current moment in UTC.
如果自UTC 1970-19-01-010000:00Z 1970年第一时刻的纪元参考日期起有秒数,则只需使用Instant.ofEpochSecond
工厂方法。
Instant instant = Instant.ofEpochSeconds( mySeconds ) ;
要以标准ISO格式生成String,只需调用Instant::toString
。
String output = instant.toString() ;
2000-06-30T19:22:15Z
对于go the other direction,正如Elliott Frisch指出的那样,将你的例子6月31日的错误改为6月30日:
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
不要使用麻烦的旧日期时间类,如Date
。它们完全被Java 8及更高版本中内置的java.time类所取代。
LocalDateTime
for your purpose在本页其他地方看到使用LocalDateTime
类的建议是不明智的。
该类故意缺乏任何时区概念或从UTC偏移。因此,此类不代表时间轴上的特定点。您将丢弃有关您的UTC价值的重要信息。
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。