簡體   English   中英

如何一般地對時間范圍建模,以允許在任何時間段或更具體的時間段內使用范圍

[英]How to model a time range generically that will allow a range for any period of time, or a more specific period of time

想象一下,如果您要對非分數時間范圍建模,則可以是以下任意一種:

"1 hour" (all/any 1 hour period)
"1 hour, starting 1pm")  (all/any 1 hour periods that start at 1pm)
"1 hour, starting 1pm, on Wednesdays" (all/any 1 hour periods that start at 1pm on wednesdays)
"1 hour, starting 1pm, on 3rd Wednesday in November"
"1 week, starting the first week in November"

你明白了。 另一個目標是輕松有效地計算這些范圍的重疊部分和子集。 例如,“ 1小時,從星期三下午1點開始”與“ 1小時,從下午1點開始”重疊

附加信息:這是基准系統中的時間段。 我想要基准線段的時間間隔有多種粒度。 就像11月3日星期三下午1點開始的任何1小時周期的基線或1pm開始的1小時周期的基線。

另外需要考慮的是,這些基准時間段將存儲在no-sql存儲中,因此最好以存儲中存在的最小粒度有效地細化時間段。 (是否存在特定的星期幾時段?不,星期幾呢?不,只是一天一小時呢?)-如果可以的話。 也許是某種樹狀的層次結構。

編輯:存儲和查詢部分可能是最重要的要求 將存儲數十億個時間段,並且需要盡快查找它們(找到存在的最精細的粒度)。 我很樂意犧牲完整性以提高查尋速度。

編輯:多考慮一下,以及如何將其存儲在數據存儲中,樹狀結構可能對有效查找很有幫助。 我可以沿着樹走,以獲得現有的最佳粒度。

          1hr
          /
       1hr@1pm
       /
     1hr@1pm@wednesday
     /
   1hr@1pm@wednesday@November

這是我想出的,但是我覺得它很薄弱。 我將繼續擺弄它並在此處進行更新,但我很好奇,看看有人是否有更聰明的方式對此進行建模。

public class DateRange {

    Integer fTimeSpan;
    TimeUnit fTimeUnit;
    Integer fStartHour;
    Integer fStartDay;
    Integer fStartWeek;
    Integer fStartMonth;

    boolean intersects(DateRange other) { ... }

}
enum TimeUnit {
    HOURS,
    DAYS,
    WEEKS,
    MONTHS;

}

編輯:一個基於樹的結構(就像我上面的編輯一樣)會簡單得多。 沒有用於大范圍跨度的未使用字段。 粒度將在樹中,而不是數據結構中。

public class RangeTreeNode {

    TimeUnit fTimeUnit;
    int fStartTime;
    int fSpanTime;
    List<RangeTreeNode> fChildren;
}

抽象

我認為您所描述的內容可以使用Joda TimeInterval類進行建模。 它支持InstantPeriodDuration的概念:

間隔表示從一毫秒瞬間到另一瞬間的時間間隔。 這兩個時刻都是日期時間連續體中完全指定的時刻,並帶有時區。

瞬時表示時間軸上的精確點,但僅限於毫秒的精度。

時間段表示以字段定義的時間段,例如3年5個月2天和7小時。 這與持續時間的不同之處在於,它以毫秒為單位不精確。 通過指定相對的瞬間(包括時間和時區),只能將一個時期解析為精確的毫秒數。

持續時間表示以毫秒為單位的時間長度。 持續時間通常是從一個間隔中獲得的。

而且,它的接口支持重疊鄰接間隙AbstractInterval中定義的其他Interval關系方法。

您可能還需要考慮部分為你的方法,這是籠統解釋這里 這將為您提供幫助,因為:

部分不完全指定日期時間連續體中的單個點,而是可以匹配多個點(部分+缺失字段+時區=即時)

例子

與您的原始問題相關的一些示例:

import static org.joda.time.DateTimeConstants.NOVEMBER;
import static org.joda.time.DateTimeConstants.WEDNESDAY;
import static org.joda.time.DateTimeFieldType.dayOfMonth;
import static org.joda.time.DateTimeFieldType.dayOfWeek;
import static org.joda.time.DateTimeFieldType.hourOfDay;
import static org.joda.time.DateTimeFieldType.monthOfYear;
import static org.joda.time.Duration.standardDays;
import static org.joda.time.Duration.standardHours;

import org.joda.time.Duration;
import org.joda.time.Partial;

public class Periods {

    public static void main(String[] args) {

        // "1 hour" (all/any 1 hour period)
        Duration d1 = standardHours(1);
        Partial p1 = new Partial();

        // "1 hour, starting 1pm" (all/any 1 hour periods that start at 1pm)
        Duration d2 = standardHours(1);
        Partial p2 = new Partial().withField(hourOfDay(), 13);

        // "1 hour, starting 1pm, on Wednesdays" (all/any 1 hour periods that start at 1pm on Eednesdays)
        Duration d3 = standardHours(1);
        Partial p4 = new Partial().withField(hourOfDay(), 13).withField(hourOfDay(), 1).withField(dayOfWeek(), WEDNESDAY);

        // "1 hour, starting 1pm, on Wednesday in November"
        Duration d4 = standardHours(1);
        Partial p3 = new Partial().withField(hourOfDay(), 13).withField(hourOfDay(), 1).withField(dayOfWeek(), WEDNESDAY).withField(monthOfYear(), NOVEMBER);

        // "1 week, starting the first week in November"
        Duration d5 = standardDays(7);
        Partial p5 = new Partial().withField(dayOfMonth(), 1).withField(monthOfYear(), NOVEMBER);
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM