Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转换时间4j持续时间<;IsoUnit>;从P365D到P1Y等等 Instant i1=Instant.now(); Instant i2=Instant.now().plusSeconds(60*60*24*365); Duration dur=Duration.from((TemporalAmount)java.time.Duration.between(i1,i2)); 系统输出打印项次(dur);_Java_Duration_Time4j - Fatal编程技术网

转换时间4j持续时间<;IsoUnit>;从P365D到P1Y等等 Instant i1=Instant.now(); Instant i2=Instant.now().plusSeconds(60*60*24*365); Duration dur=Duration.from((TemporalAmount)java.time.Duration.between(i1,i2)); 系统输出打印项次(dur);

转换时间4j持续时间<;IsoUnit>;从P365D到P1Y等等 Instant i1=Instant.now(); Instant i2=Instant.now().plusSeconds(60*60*24*365); Duration dur=Duration.from((TemporalAmount)java.time.Duration.between(i1,i2)); 系统输出打印项次(dur);,java,duration,time4j,Java,Duration,Time4j,这个代码打印P365D,有没有办法让单位填满下一个更大的单位,所以这个变成P1Y,如果我喜欢P334D到P11M,等等 time4j版本是4.38一年没有固定的秒数: 闰年的另一天是2月29日 有时会添加 由于上述原因,你必须知道一年中有多少秒。似乎应该使用LocalDate和Period而不是Instant和Period(至少在使用java.time时是这样): 其他评论和答案完全正确地说,一年并不总是等于365天 Time4J方法使用STD_PERIOD作为标准化器返回标准化的持续时间。该规

这个代码打印P365D,有没有办法让单位填满下一个更大的单位,所以这个变成P1Y,如果我喜欢P334D到P11M,等等


time4j版本是4.38

一年没有固定的秒数:

  • 闰年的另一天是2月29日
  • 有时会添加
  • 由于上述原因,你必须知道一年中有多少秒。似乎应该使用
    LocalDate
    Period
    而不是
    Instant
    Period
    (至少在使用
    java.time
    时是这样):


    其他评论和答案完全正确地说,一年并不总是等于365天

    Time4J方法使用
    STD_PERIOD
    作为标准化器返回标准化的持续时间。该规范化器的文档说明:

    在1年=12个月和1年的基础上,对工期项目进行规范化 天=24小时1小时=60分钟1分钟=60秒- 不将天转换为月

    因此,当以秒为单位定义时间量时,您只能期望结果以天为单位

    如果你仍然想要一年,那么我建议你首先使用一个合适的时区将你的瞬间转换成日历日期。但在闰年,您的代码仍然会生成365天,而不是在第二个瞬间添加
    60*60*24*365
    秒后的一年。所以你增加秒数也是有缺陷的,因为它是基于错误的假设

    旁注: 如果您想要相反的方式,即一年中有多少秒,那么您可以使用如下代码

    Moment m1 = Moment.nowInSystemTime();
    Moment m2 = m1.toZonalTimestamp(ZonalOffset.UTC).plus(1, CalendarUnit.YEARS).atUTC();
    long seconds = SI.SECONDS.between(m1, m2); // = 366 days in seconds if applied on date 2019-05-22!
    
    随着未来版本的Time4J和2019年底可能出现的闰秒,该代码甚至可能产生额外的秒数

    无论如何,我建议您更新Time4J到V5.4,并考虑以下映射: 因此,如果您确实希望在打印持续时间中以年作为可能的输出,并且您有Instant/moments,那么在创建适当的持续时间对象之前,首先将其转换为LocalDateTime/PlainTimestamp(使用时区或偏移量)

    2019-05-25更新: 版本5.4(或更高版本)的另一种方法是通过“模糊”持续时间。您可以通过应用近似值来规范化得到的持续时间。例如:

        Duration<IsoUnit> d = Duration.of(60 * 60 * 24 * 365, ClockUnit.SECONDS);
        d = d.with(Duration.approximateMaxUnitOnly());
        System.out.println(d); // P1Y
    
    Duration d=持续时间(60*60*24*365,时钟单位秒);
    d=d.with(Duration.approximateMaxUnitOnly());
    系统输出打印Ln(d);//P1Y
    

    由于这种标准化的性质,您无法期望准确的结果。

    一年可能有365天或366天。你怎么知道该选哪一个?这个月也一样。
    java.time.Instant as input => net.time4j.MachineTime.from(...)
    java.time.LocalDateTime/net.time4j.PlainTimestamp => net.time4j.Duration.from(...)
    
        Duration<IsoUnit> d = Duration.of(60 * 60 * 24 * 365, ClockUnit.SECONDS);
        d = d.with(Duration.approximateMaxUnitOnly());
        System.out.println(d); // P1Y