实现“部分日期”对象

时间:2010-02-15 16:14:22

标签: c# data-structures

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

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工作,是否有部分框架(或第三方库)可以提供此功能?

5 个答案:

答案 0 :(得分:3)

类本身非常简单,只有三个可为空的整数组成日期组件。 (如果你想了解如何正确实现结构,你甚至可以把它变成一个结构。)

使处理特殊情况变得有点复杂,例如:

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

(另外,看一下year,month,day结构中使用的参数顺序DateTime,您可能希望复制该模式而不是发明新模式。)

单个类的替代方法可以是基类,其具有针对单独日期的特定实现:

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

答案 1 :(得分:2)

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

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

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

  1. 2008年。
  2. 三月的第二天。
  3. 每个月的第一天。
  4. 没有明显的理由在任何其他人之前或之后提出任何这些。

答案 2 :(得分:1)

我没有看到任何重大问题,但我不确定这是最好的方法。如果每周一发生什么事怎么办?您无法使用PartialDate表达此信息。其他类型的时间表也可能很难。

另一种选择可能是拥有像YearlySchedule,MonthlySchedule,WeeklySchedule,OneTimeSchedule这样的类,以及某种方式来组合和排除它们。

我从谷歌搜索中找到的另一个选项是Flexible Time Schedule,它使用谓词来指定日期。

答案 3 :(得分:1)

您可以查看DevExpress中的Scheduler control

无论如何,在我们的应用程序中,我们没有使用它,因为我们确实需要更精细的粒度,并且不需要用于UI表示的日历。我们所做的是创建一个基本的Interval接口,其中包含一个基于最后一个调度程序运行计算下一个日期的方法,并为MontlyInterval,WeeklyInterval等创建了一些类,实现了接口。

答案 4 :(得分:1)

我使用了部分日期作为存储机制:

这样的东西
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年不是很有用)。