java.time.Period 秒

java.time.Period to 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;

the documentation中所说,Period是以日、月、年表示的时间段;你的例子是 "one month."

一个月的秒数不是固定值。 2 月有 28 或 29 天,而 12 月有 31 天,因此(比方说)2 月 12 日的 "one month" 比 12 月 12 日的 "one month" 秒数少。有时(例如去年),12 月会有闰秒。根据时区和月份的不同,它可能会多出 30 分钟、一个小时或一个半小时;或者比平时少得多,这要归功于进入或退出夏令时。

只能问"Starting from this date in this timezone, how many seconds are there in the next [period] of time?"(或者"How many seconds in the last [period] before [date-with-timezone]?")没有参考点就不能问,没有意义。 (您现在已更新问题以添加参考点:"now"。)

如果我们引入一个参考点,那么就可以使用Temporal (like LocalDateTime or ZonedDateTime) as your reference point and use its until method with 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);

Live Copy

当然可以更简洁,我想把每一步都展示出来。更简洁:

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

"get" 方法仅接受 ChronoUnit.YEARS、ChronoUnit.MONTHS 和 ChronoUnit.DAYS。