Java 是否有包含/排除时间间隔结束的标准?

Java 是否有包含/排除时间间隔结束的标准?,java,date,time,conventions,Java,Date,Time,Conventions,我想知道是否有一种标准或“正常”的方法来解释时间间隔数据终点,即定义终点的值的包容性/排他性。但是请注意,我问的是标准(或最常见的)惯例是什么(如果有),而不是关于你个人偏好的论文。如果你真的想提供一篇论文,请将其附在某人发表的标准参考或关于该问题的标准文本上。开放标准(我无需付费阅读)是首选标准,除非它们存在根本缺陷:) 当然,从a到B的时间间隔有4种可能: (A,B)-两端都是排他性的 [A,B]-两端都包括在内 [A,B)-开始是包含的,结束是独占的 (A,B)-开始是独占的,结束是包含的

我想知道是否有一种标准或“正常”的方法来解释时间间隔数据终点,即定义终点的值的包容性/排他性。但是请注意,我问的是标准(或最常见的)惯例是什么(如果有),而不是关于你个人偏好的论文。如果你真的想提供一篇论文,请将其附在某人发表的标准参考或关于该问题的标准文本上。开放标准(我无需付费阅读)是首选标准,除非它们存在根本缺陷:)

当然,从a到B的时间间隔有4种可能:

  • (A,B)-两端都是排他性的
  • [A,B]-两端都包括在内
  • [A,B)-开始是包含的,结束是独占的
  • (A,B)-开始是独占的,结束是包含的
  • 每一个都有不同的特点(在我看来,请随意指出更多)

    [A,B]公约具有似乎不方便的性质,即B包含在[A,B]和[B,C]文件中。如果B表示午夜边界,并且您试图确定它在哪一天,这尤其不方便。此外,这意味着间隔的持续时间计算起来有点烦人,因为[A,B]其中A=B的长度应为1,因此[A,B]的持续时间为(B-A)+1

    类似地,(A,B)约定也会有困难,即B既不属于(A,B)也不属于(B,C)…继续类比日边界,午夜将是这两天的一部分。这在逻辑上也是不方便的,因为[A,B]其中A=B是持续时间小于零的非感测间隔,但反转A和B并不使其成为有效间隔

    所以我想我想要[A,B]或者(A,B),但我不知道如何在两者之间做出决定

    因此,如果有人链接到一个标准文件,引用一个标准文本或类似的文件来澄清公约,那就太好了。或者,如果你可以链接到各种标准文件和/或或多或少完全不一致的引用文件,那么我可以选择一个似乎对CMA有足够权限的文件,并对其进行修改我同意:)


    最后,我将在Java中工作,因此我特别容易接受在Java中工作良好的答案。

    我不能肯定,但我怀疑是否存在标准或约定。你是否包括开始或结束时刻取决于你的用例,所以考虑它们是否对你很重要。如果决定是任意的,选择一个,注意选择是任意的,然后继续


    至于Java支持的内容,Joda时间库实现了包括开始时间但不包括结束时间的s

    我将使用Voo的链接为我们的团队提供我所写的答案,直到Voo添加答案,然后我将给他评分。以下是我为我们的案例所做的决定:

    应用程序中的时间间隔将表示为一对 瞬时时间与约定的开始时间相同 包含,并且结束时间是独占的。这个公约是 数学上很方便,因为边界的差异是 等于间隔的长度,并且在数值上也是 与java中数组和列表的订阅方式一致 计划(见)。这个 实际结果是,间隔2012-03-17T00:00:00.000Z—— 2012-03-18T00:00:00.000Z表示整个圣帕特里克节, 从2012年3月17日开始的每个日期将被确定为 包括在圣帕特里克节,但2012-03-18T00:00:00.000Z不包括在内 包括在内,圣帕特里克节将包括24*60*60*1000 毫秒


    在一般情况下,
    [A,B)
    (包含开始,独占结束)有很多优点,我看不出任何理由说明时间间隔的情况不一样

    Djikstra写了一篇关于它的好文章,尽管它的名字很好,但主要是关于这一点

    优点的简短总结:

    • end-start
      等于列表中的项目数
    • 上一个区间的上界是下一个区间的下界
    • 允许对从0开始的具有无符号数字[1]的间隔进行索引
    P.>个人看来,第二点对于许多问题非常有用;考虑一个非常标准的递归函数(在伪Python中):

    使用包含上限编写相同的代码会引入大量容易出错的错误


    [1] 这是与
    (A,B)相比的优势
    -从0开始的间隔比以
    MAX\u VAL
    结束的间隔更常见。注意,这还涉及到一个额外的问题:使用两个包含的边界意味着我们可以表示一个长度不能用相同大小表示的序列。

    尽管这个线程更关注Java,但我认为它会非常有趣ng希望看到其他采用的约定,特别是考虑到
    pandas
    Python在当今的数据分析中无处不在,而且这个StackOverflow页面是查找时间范围的包容性/排他性约定时最热门的搜索结果之一

    引述:

    开始日期和结束日期严格包括在内。因此,如果指定,它将不会生成这些日期之外的任何日期

    此外,它不仅生成日期范围。在尝试索引到时间序列数据时也采用了该约定。下面是一个使用
    DatetimeIndex

    >>> import pandas as pd
    >>> pd.__version__
    '0.20.2'
    >>> df = pd.DataFrame(list(range(20)))
    >>> df.index = pd.date_range(start="2017-07-01", periods=20)
    >>> df["2017-07-01":"2017-07-05"]
                0
    2017-07-01  0
    2017-07-02  1
    2017-07-03  2
    2017-07-04  3
    2017-07-05  4
    
    java.time&Half-Open 取代麻烦的遗留日期时间类的类以及Joda时间项目使用半开放方法[)定义了一个时间跨度,其中开始是包含的,而结束是独占的

    >>> import pandas as pd >>> pd.__version__ '0.20.2' >>> df = pd.DataFrame(list(range(20))) >>> df.index = pd.date_range(start="2017-07-01", periods=20) >>> df["2017-07-01":"2017-07-05"] 0 2017-07-01 0 2017-07-02 1 2017-07-03 2 2017-07-04 3 2017-07-05 4