代码之家  ›  专栏  ›  技术社区  ›  Greg B

实现“部分日期”对象

  •  4
  • Greg B  · 技术社区  · 15 年前

    我们有一个要求 部分日期 “允许您指定日期的对象,例如

    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 回复  |  直到 15 年前
        1
  •  3
  •   Guffa    15 年前

    类本身相当简单,只为日期组件提供三个可以为空的整数。(如果您想了解如何正确实现结构,甚至可以将其设置为结构。)

    处理特殊情况有点复杂,比如:

    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
    
        2
  •  2
  •   Jeffrey L Whitledge    15 年前

    我对这个项目的未来有些担心。用户有一种想要更多功能的坏倾向,这种设计中有一些主要的缺陷。

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

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

    1. 公元2008年。
    2. 三月二日。
    3. 每月的第一天。

    没有明显的理由把这些放在任何其他人之前或之后。

        3
  •  1
  •   Mark Byers    15 年前

    我看不出有什么大问题,但我不确定这是最好的解决办法。如果每个星期一都发生什么事呢?你没有办法用你的党派来表达这一点。其他类型的时间表也可能很困难。

    另一种选择可能是使用诸如YearlySchedule、MonthlySchedule、WeeklySchedule、OneTimeSchedule之类的类,以及某种组合和排除它们的方法。

    我从谷歌上找到的另一个选择是 Flexible Time Schedule 它使用谓词指定日期。

        4
  •  1
  •   jmservera    15 年前

    你可以看看 Scheduler control 来自DevExpress。

    总之,在我们的应用程序中,我们没有使用它,因为我们确实需要更细的粒度,并且不需要日历来表示UI。我们所做的是用一种方法创建一个基本的间隔接口,该方法基于上一次运行的调度程序计算下一个日期,并为MontlyInterval、WeeklyInterval等创建了一些类来实现该接口。

        5
  •  1
  •   Joshua    15 年前

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

    类似的东西

    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
    

    我从未试图定义可比性的全部范围(空年份不是很有用)。