实现“部分日期”对象

我们需要一个“ 部分日期 ”对象,它允许您指定日期,例如

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 ,但这不在我的问题范围内)。

我有一些问题:

  1. 这是一个坏主意吗?
  2. 我在.NET工作,是否有部分框架(或第三方库)将提供此function?

类本身非常简单,只有三个可为空的整数用于日期组件。 (如果您想了解如何正确实现结构,您甚至可以将其作为结构。)

使它有点复杂的是处理特殊情况,例如:

 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 

我对这个项目的未来有些担忧。 用户有一种需要更多function的恶劣趋势,并且在这种设计中存在一些主要问题。

首先,没有数星期和星期几的支持。 人们可能会认为,一旦你有了年,月和日,就可以很容易地添加周和工作日。 但它一点也不简单! 日期组件的各个子集之间的交互将非常复杂。

其次,任意排序要求将很快变得非常复杂。 如何排序以下内容?

  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年不是很有用)。