java.time.Period到秒

java.time.Period到秒,java,time,days,period,seconds,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 我正在寻找相当于以下内容的J

如何将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;
如中所述,
期间
是以天、月和年表示的一段时间;你的例子是“一个月”

一个月的秒数不是一个固定值。二月有28或29天,而十二月有31天,所以从二月十二日算起的“一个月”比从十二月十二日算起的“一个月”的秒数要少。有时(比如去年),12月份会有闰秒。根据时区和月份的不同,它可能有额外的30分钟、1小时或1.5小时;或者比平常少很多,这要感谢进入或退出夏令时

你只能问“从这个时区的这个日期开始,下一个[时段]有多少秒?”(或者,“在[带时区的日期]之前的最后一个[时段]有多少秒?”),没有参考点你不能问,这没有意义。(您现在更新了问题,添加了一个参考点:“现在”。)

如果我们引入一个参考点,那么您可以使用(like或)作为您的参考点,并将其方法用于。例如,在从“现在”开始的当地时间:

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

LocalDateTime start = LocalDateTime.now();
System.out.println(start.until(start.plus(Period.parse("P1M")), ChronoUnit.MILLIS));
如中所述,
期间
是以天、月和年表示的一段时间;你的例子是“一个月”

一个月的秒数不是一个固定值。二月有28或29天,而十二月有31天,所以从二月十二日算起的“一个月”比从十二月十二日算起的“一个月”的秒数要少。有时(比如去年),12月份会有闰秒。根据时区和月份的不同,它可能有额外的30分钟、1小时或1.5小时;或者比平常少很多,这要感谢进入或退出夏令时

你只能问“从这个时区的这个日期开始,下一个[时段]有多少秒?”(或者,“在[带时区的日期]之前的最后一个[时段]有多少秒?”),没有参考点你不能问,这没有意义。(您现在更新了问题,添加了一个参考点:“现在”。)

如果我们引入一个参考点,那么您可以使用(like或)作为您的参考点,并将其方法用于。例如,在从“现在”开始的当地时间:

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

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

“get”方法只接受ChronoUnit.YEARS、ChronoUnit.MONTHS和ChronoUnit.DAYS。

该“get”方法只接受ChronoUnit.YEARS、ChronoUnit.MONTHS和ChronoUnit.DAYS。

被描述为“基于日期的时间量”。它不支持小于天的字段。“一个月内的秒数”的正确答案可能是什么?所以我没有抓住要点。较旧的类javax.xml.datatype.Duration比较新的java.time.Period和Duration duo要好得多?我认为迁移到Java8会给我带来好处,但我认为最好还是保留旧代码,不要接触Java8中的句点类和久期类。被描述为“基于日期的时间量”。它不支持小于天的字段。“一个月内的秒数”的正确答案可能是什么?所以我没有抓住要点。较旧的类javax.xml.datatype.Duration比较新的java.time.Period和Duration duo要好得多?我认为迁移到java 8会给我带来好处,但是我认为最好还是保持旧代码,不要接触java 8的句号和句号类。如果我们认为javax .xML.DATATYPE.FILL类是正确的,我不同意所有的降级和最后的语句。例如,代码运行良好:DatatypeFactory DatatypeFactory=DatatypeFactory.newInstance();持续时间d1=datatypeFactory.newDuration(“P1M”);最终长秒=d1.getTimeInMillis(新日期())@SewerynHabdank Wojewódzki:
java.xml.datatype.Duration
getTimeInMillis
支持我的最后一句话:注意它是如何接受一个时间参考点作为参数的。你的代码告诉你从“现在”开始的一个月有多少毫秒。要做到这一点,请使用
ZoneDateTime
,并传入
期间,然后确定两个时间点之间的毫秒数。如果我希望P1M中的秒数是固定值,我将定义“常量”应用程序中的值,不要使用句点类。这是我问题的核心。获得秒数的最佳方式是什么。我知道评论家认为我是白痴。但对于我来说,现在还不清楚用Java8 spirit进行这样的计算。特别是ava.xml.datatype.Duration可以同时包含基于日期的时段/持续时间和基于时间的时段/持续时间。Java8拆分了责任,当字符串可能是以时间或日期为基础的时,使用中会出现什么问题。因此,我不想得到固定的值,但我希望能够很好地完成Java 8 API的计算。@SewerynHabdank Wojewódzki:我已经更新了答案,以显示从现在开始一个月的一种方法(“从现在开始”是您问题中缺少的部分)用java 8 API。坦率地说,如果我们认为JavaX.xML.DATATYPE.FITCH类是正确的,那么我不同意所有这些降级和最后的语句。例如,代码运行良好:DatatypeFactory DatatypeFactory=DatatypeFactory.newInstance();持续时间d1=datatypeFactory.newDuration(“P1M”);最终长秒=d1.getTimeInMillis(新日期())@SewerynHabdank Wojewódzki:
java.xml.datatype.Duration
getTimeInMillis
支持我的最后一句话:注意它是如何接受一个时间参考点作为参数的。您的代码告诉您从“现在”开始的月份有多少毫秒