java.time.Period到秒

Sew*_*zki 1 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
Run Code Online (Sandbox Code Playgroud)

我正在寻找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;
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 8

正如文档所述,Period是一段以天,月和年表示的时间段; 你的榜样是"一个月".

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

你只能问"从开始这个日期这个时区,多少秒出现在未来[期间]的时间呢?" (或者,"在[date-with-timezone]之前的最后[期间]中有多少秒?")没有参考点你不能问它,它没有意义. (您现在已更新问题以添加参考点:"now".)

如果我们引入一个参考点,那么你可以使用Temporal(LocalDateTime或者ZonedDateTime)作为你的参考点并使用它的until方法ChronoUnit.MILLIS.例如,从"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);
Run Code Online (Sandbox Code Playgroud)

实时复制

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

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