Is there a name for date/time interval format like "1h10m"

Cam*_*urd 2 datetime duration date dateinterval

即使在软件之外,以截断的方式传达时间或日期间隔也是很平常的事。例如:1h10m转换为“一小时十分钟”。

这可以抽象为一组规则。例如:一个日期间隔被表示为的组合_h_m(等),其中_的符号代表非负整数或浮点数,其被概括成一个日期间隔对象。

允许混合天,小时,分钟。例如,0.5d1h60m将是的同义词14h

是否有类似的地方定义了这样的标准?

小智 5

此标准是持续时间,由ISO 8601定义。请注意,“ 间隔”是一个不同的概念(也由同一ISO定义),尽管两者密切相关:

  • 持续时间定义了一个的时间(如“1小时10分钟”或“2年,3月4天”)。但是它不会告诉您何时开始或结束(相对于什么时间是“ 1小时10分钟”)。只是时间本身。
  • 一个时间间隔(引用维基百科)是“两个时间点之间的间隔时间”。它具有定义的开始日期和结束日期,但是您可以使用Duration来定义它,因为它可以有4种不同的格式:
    1. 开始和结束,例如 2007-03-01T13:00:00Z/2008-05-11T15:30:00Z
    2. 开始和持续时间,例如 2007-03-01T13:00:00Z/P1Y2M10DT2H30M
    3. 持续时间和结束时间,例如 P1Y2M10DT2H30M/2008-05-11T15:30:00Z
    4. 仅持续时间,例如P1Y2M10DT2H30M带有其他上下文信息

情况1、2和3是等效的(都具有相同的开始和结束日期)。唯一的区别是,在情况2和3中,持续时间P1Y2M10DT2H30M用于计算另一个日期(在情况2中,您将其添加到开始日期,在情况3中,您将其从结束日期中减去)。


正如你可以在上面看到,对于一个标准的格式,时间P[n]Y[n]M[n]DT[n]H[n]M[n]S,其中:

  • P是放置在持续时间表示开始处的持续时间指示符(用于周期)。
  • Y是跟随年份值的年份指示符。
  • M是跟随月份数的月份指示符。
  • W是跟随星期数的值的星期指示符。
  • D是跟随天数值的天数指示符。
  • T是在表示的时间成分之前的时间指示符。
  • H是跟随小时数的值的小时指示符。
  • M是分钟数值后面的分钟指示符。
  • S是第二个指示符,它跟在秒数之后。

因此,“1年10个月”被表示为P1Y10M“1小时10分钟”是PT1H10M(注意,T是需要解决1个月(之间的potencial歧义P1M)1分钟(PT1M),因为它们使用相同的字母M作为代号)。


正如@MattJohnson所说,带有日期的数学并不总是很明显,因此不同持续时间之间的等效性不是我们通常期望的。

对于下面的示例,我正在使用Java 8(只是为了说明持续时间是多么棘手)。请注意,java.timeAPI使用2个不同的类(PeriodDuration),但是两者的想法是相同的(它们都是时间量)。

  • 1个月的时间等于多少天?这取决于:

    // one month period
    Period oneMonth = Period.parse("P1M");
    // January 1st
    LocalDate jan = LocalDate.of(2016, 1, 1);
    System.out.println(jan); // 2016-01-01
    // January 1st plus 1 month period = February 1st
    LocalDate feb = jan.plus(oneMonth);
    System.out.println(feb); // 2016-02-01
    // February 1st plus 1 month period = March 1st
    LocalDate mar = feb.plus(oneMonth);
    System.out.println(mar); // 2016-03-01
    
    // difference between Jan 1st and Feb 1st = 31 days
    System.out.println(ChronoUnit.DAYS.between(jan, feb)); // 31
    // difference between Feb 1st and Mar 1st = 29 days (2016 is leap year)
    System.out.println(ChronoUnit.DAYS.between(feb, mar)); // 29
    
    Run Code Online (Sandbox Code Playgroud)

因此,在2月1 日的 1月1 结果中加上1个 -在这种情况下,1个月等于31天(又名1个月持续时间()等于31持续时间(加上1个月到2月1日ST结果年3月1 (在这种情况下,1个月= 29日,因为2016年是闰年)。P1MP31D

  • 1天= 24小时?不总是。如果涉及夏令时转换,您会得到奇怪的结果:

    // 1 day period
    Period oneDay = Period.parse("P1D");
    // 24 hours period
    Duration twentyFourHours = Duration.parse("PT24H");
    // in Sao Paulo, summer time starts at Oct 15, at midnight
    // getting a date one day before DST change, at 10:00 AM
    ZonedDateTime z = ZonedDateTime.of(2017, 10, 14, 10, 0, 0, 0, ZoneId.of("America/Sao_Paulo"));
    System.out.println(z); // 2017-10-14T10:00-03:00[America/Sao_Paulo]
    
    // add 1 day - gets the same hour (10:00 AM)
    System.out.println(z.plus(oneDay)); // 2017-10-15T10:00-02:00[America/Sao_Paulo]
    
    // add 24 hours - gets 11:00 AM because of DST shift (at midnight, clocks moved forward 1 hour)
    System.out.println(z.plus(twentyFourHours)); // 2017-10-15T11:00-02:00[America/Sao_Paulo]
    
    Run Code Online (Sandbox Code Playgroud)

2017年10月15 在圣保罗,DST开始(时钟向前移动1小时),因此:

  • 如果添加24小时10月14日上午10点,你会得到10月15日11 AM
  • 但是,如果您增加1天,则将10月15 上午10点获得

因此,在这种情况下,1天= 23小时- 意味着增加1天的持续时间(P1D)等于增加23小时的持续时间(PT23H

DST结束后,情况恰好相反:时钟向后移1小时,而1天等于25小时。

因此,该标准定义了时间概念的格式和含义,但是不同持续时间之间的等效性取决于上下文(尽管听起来不直观的是1天并不总是24小时,但是日期/时间数学却是没有我们想要的那么明显)。

  • 非常精确和有见地。谢谢! (2认同)