簡體   English   中英

實現“部分日期”對象

[英]Implementing a “Partial Date” object

我們需要一個“ 部分日期 ”對象,它允許您指定日期,例如

new PartialDate(1, null, null);  // first of the month
new PartialDate(1, 2, null);     // first of the February
new PartialDate(null, 2, null);  // February

用例與事件有關。 例如,您可能每年1月都有一個課程,在這種情況下,您不需要或不需要指定日期對象的年份組件。

我們需要能夠根據一些任意規則對這些日期進行排序,因此我想實現一種數據類型(它將實現IComparable<PartialDate> ,但這不在我的問題范圍內)。

我有一些問題:

  1. 這是一個壞主意嗎?
  2. 我在.NET工作,是否有部分框架(或第三方庫)將提供此功能?

類本身非常簡單,只有三個可為空的整數用於日期組件。 (如果您想了解如何正確實現結構,您甚至可以將其作為結構。)

使它有點復雜的是處理特殊情況,例如:

new PartialDate(29, 2, null); // occurs only on leap years
new PartialDate(31, null, null); // occurs only seven months in a year

(另外,看一下DateTime結構中使用的參數順序year,month,day ,您可能希望復制該模式而不是發明新模式。)

單個類的替代方法可以是基類,其具有針對單獨日期的特定實現:

new MonthlyPartialDate(1); // the first every month
new YearlyParticalDate(2, 1); // the first of february
new YearlyPartialDate(2); // february

我對這個項目的未來有些擔憂。 用戶有一種想要更多功能的惡劣趨勢,並且在這種設計中存在一些主要問題。

首先,沒有數星期和星期幾的支持。 人們可能會認為,一旦您有年,月和日,那么周和工作日將很容易添加。 但它一點也不簡單! 日期組件的各個子集之間的交互將非常復雜。

其次,任意排序要求會很快變得非常復雜。 如何排序以下內容?

  1. 2008年。
  2. 三月的第二天。
  3. 每個月的第一天。

沒有明顯的理由在任何其他人之前或之后提出任何這些。

我沒有看到任何重大問題,但我不確定這是最好的方法。 如果每周一發生什么事怎么辦? 您無法使用PartialDate表達此信息。 其他類型的時間表也可能很難。

另一種方法是使用像YearlySchedule,MonthlySchedule,WeeklySchedule,OneTimeSchedule這樣的類,以及某種方式來組合和排除它們。

我從谷歌搜索中找到的另一個選項是靈活時間表 ,它使用謂詞來指定日期。

您可以從DevExpress查看Scheduler控件

無論如何,在我們的應用程序中,我們沒有使用它,因為我們確實需要更精細的粒度,並且不需要用於UI表示的日歷。 我們所做的是創建一個基本的Interval接口,其中包含一個基於最后一個調度程序運行計算下一個日期的方法,並為MontlyInterval,WeeklyInterval等創建了一些類,實現了該接口。

我使用了部分日期作為存儲機制:

就像是

Structure PartialDate
    Public Month As Byte '0 = null
    Public Day as Byte '0 = null
    Public Year As Integer '0 = null (there is no 0 year)
End Structure

我從未試圖定義可比較的全部色域(null年不是很有用)。

暫無
暫無

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

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