如何从历元开始经过微秒长的时间,然后从Java 8中获得相同的月和年

我找到了以下代码:

long timeStampSeconds = ChronoUnit.micrOS.between(Instant.EPOCH,Instant.now());

但是当我使用以下代码将其转换回获取月份和年份时,会给出错误的输出。

try {
    epochLong = Long.parseLong(epoch);
} catch (RuntimeException e) {
    //Log exception
    return null;
}

Calendar cal = Calendar.getInstance();
cal.setTimeInmillis(epochLong);
String month = String.valueOf(cal.get(Calendar.MONTH));
String year = String.valueOf(cal.get(Calendar.YEAR));
//print month and year

关于如何在微秒内生成此值并获得正确的月份和年份的任何指针?请帮忙。

bestd 回答:如何从历元开始经过微秒长的时间,然后从Java 8中获得相同的月和年

如果您从Java-8使用java.time,则可以使用:

long timeStampSeconds = ChronoUnit.MICROS.between(Instant.EPOCH,Instant.now());

您可以将其转换为一个瞬间,然后将该瞬间转换为ZoneDateTime

Instant inst = Instant.EPOCH.plus(timeStampSeconds,TimeUnit.MICROSECONDS.toChronoUnit());
ZonedDateTime zdt = inst.atZone(ZoneId.of("Europe/Paris"));

然后您可以获取月,年,日,小时,...

Month month = zdt.getMonth();
int year = zdt.getYear();

输出

MICROS:       1574073141066090
ZoneDateTime: 2019-11-18T11:32:21.066090+01:00[Europe/Paris]
,

这取决于平台和Java版本。

在我的Mac示例中,代码中的timeStampSeconds值包括

  • 使用jdk-1.8.0_121:1574193249064000和1574193338130000;所以总是以000结尾
  • 使用li dk-9.0.4:1574193430428678和1574193438362321;因此通常不会以000结尾。

在Java 8上,java.time类的now方法没有比millisenods更好的粒度,因此毫秒级的毫秒数始终为000。在Java 9上,如果平台更精细支持它,并非所有平台都支持。

因此,如果您始终获得000,则解决方案是至少升级到Java 9并在支持微秒精度的计算机上运行Java程序。

不要使用日历

Calendar类的设计很差,而且已经过时了。而且,它永远不支持任何毫秒以上的单位。要将微秒值转换回日期和时间对象,请使用例如:

    long timeStampSeconds = 1_574_193_438_362_321L;
    Instant convertedBack = Instant.EPOCH.plus(timeStampSeconds,ChronoUnit.MICROS);
    System.out.println(convertedBack);
  

2019-11-19T19:57:18.362321Z

您会注意到保留了完整的微秒精度。 YCF_L在另一个答案中已经显示了如何获取年和月的值。

本文链接:https://www.f2er.com/3082049.html

大家都在问