java.time.Period到秒

时间:2017-01-27 12:21:27

标签: java time days period seconds

如何将java.time.Period转换为秒?

以下代码会产生意外结果

java.time.Period period = java.time.Period.parse( "P1M" );
final long days = period.get( ChronoUnit.DAYS ); // produces 0
final long seconds = period.get( ChronoUnit.SECONDS ); // throws exception

我正在寻找与以下内容相同的Java 8:

// import javax.xml.datatype.DatatypeFactory;
// import javax.xml.datatype.Duration;

DatatypeFactory datatypeFactory = DatatypeFactory.newInstance();
Duration d1 = datatypeFactory.newDuration( "P1M" ); 
final long sec = d1.getTimeInMillis( new Date() ) / 1000;

2 个答案:

答案 0 :(得分:8)

正如the documentation中所述,Period是以天,月和年表示的一段时间;你的例子是“一个月。”

一个月内的秒数不是固定值。 2月份有28天或29天,而12月份有31天,因此从2月12日开始的“一个月”比12月12日的“一个月”的秒数少。偶尔(比如去年),12月份有一个闰秒。根据时区和月份,可能需要额外30分钟,小时或一小时半;由于进入或退出夏令时,所以或者比往常少得多。

您只能在此时区中询问“从此日期开始,在下一个[期间]的时间内会有多少秒?” (或者,“在[date-with-timezone]之前的最后[期间]中有多少秒?”)没有参考点你不能问它,它没有意义。 (您现在已更新问题以添加参考点:“现在”。)

如果我们引入参考点,那么您可以使用Temporal(例如LocalDateTimeZonedDateTime)作为参考点,并使用until方法ChronoUnit.MILLIS 3}}。例如,从“now”开始的当地时间:

LocalDateTime start = LocalDateTime.now();
Period period = Period.parse("P1M");
LocalDateTime end = start.plus(period);
long milliseconds = start.until(end, ChronoUnit.MILLIS);
System.out.println(milliseconds);

Live Copy

当然,这可以更简洁,我想展示每一步。更简洁:

LocalDateTime start = LocalDateTime.now();
System.out.println(start.until(start.plus(Period.parse("P1M")), ChronoUnit.MILLIS));

答案 1 :(得分:-1)

" get"方法只接受ChronoUnit.YEARS,ChronoUnit.MONTHS和ChronoUnit.DAYS。