C# 我应该如何为任意时间段建模?

C# 我应该如何为任意时间段建模?,c#,data-modeling,C#,Data Modeling,我很难想象一个对象模型可以存储以下时间段: "Any Wednesday from 2:00PM to 3:00PM" "April 1, 2010" "All April for any year" "Any day in April from 2:00PM to 3:00PM for any year" "Any day 1:30PM to 2:00PM" "Any April 1 to Any April 3" 有时这段时间是一个特定的日期,其他时间是一周中的一天加上一个时间跨度。也许一

我很难想象一个对象模型可以存储以下时间段:

"Any Wednesday from 2:00PM to 3:00PM"
"April 1, 2010"
"All April for any year"
"Any day in April from 2:00PM to 3:00PM for any year"
"Any day 1:30PM to 2:00PM"
"Any April 1 to Any April 3"
有时这段时间是一个特定的日期,其他时间是一周中的一天加上一个时间跨度。也许一个月

针对模型测试给定的
DateTime
,这是一个单独的问题,稍后我将不得不解决。有没有一种方法可以在POCOs中模拟这种想法?我画的是空白


我不是在寻找一组表示两个不同时间点的
DateTime
s。我正在寻找一种结构,它将存储与创建手机通话计划或轮班相同的时间段。

存储两个日期时间有什么错

当您需要用它来表示/做其他事情时,它的表示形式可以更改为您想要的任何形式,但在您用它进行的任何操作中,起点和终点都是必须的

因此,当您需要字符串表示时,您只需要一些自定义逻辑来决定日期时间是否在同一天(然后只输出一次该天),日期是否在当前周(仅输出该天),等等

当然,您也可以保留一些粒度度量,或者也可以从代码中获取粒度度量——如果变量没有时间信息,那么很明显,输出应该仅为“4月1日到4月3日”;如果起点和终点正好落在一个月上,则只输出该月


我认为这比听起来容易,因为你只需要为日期的每个组成部分处理几个案例。这也将使以后比较和匹配时间间隔变得更容易。当然,实际代码的结构可能比我描述的要好得多——我绝对不是在建议几个大的嵌套if

就我个人而言,我可能会使用一堆可空值,例如:

public class /* or struct? */ ArbitraryPointInTime
{
    public int? Year { get; private set; }
    public int? Month { get; private set; }
    public int? Day { get; private set; }
    public int? Hour { get; private set; }
    public int? Minute { get; private set; }
    public int? Second { get; private set; }
    public TimeZone TimeZone { get; private set; }

    // Bunch of constructors that construct a valid structure
    // Prevent nonsensical combinations, e.g. Second specified but Minute null
}

public class /* or struct? */ ArbitraryTimePeriod
{
    public ArbitraryPointInTime? Start { get; private set; }
    public ArbitraryPointInTime? End { get; private set; }

    // Bunch of constructors as above
}
然后,我会考虑需要哪些方法来处理这些数据。就我个人而言,我会保持结构不变,让每个方法都返回一个新实例(当然,除非它返回bool或其他东西)。为这些方法中的每一种写一个规范,仔细考虑所有的具体情况。Eric Lippert在对问题的评论中给出了几个案例。写下每个方法在这些情况下应该做什么,即使答案是“抛出异常”

然后实现规范


然后编写一组单元测试。:)

您可以编写一个类来存储开始时间(DateTime)和表示从开始时间开始的时段的时间跨度。正如Eric提到的,在设置开始日期时,您必须考虑时区。

我遇到过一个出现类似问题的系统。我们的解决方案是一个
时间表
,它定义了一个总体的开始和结束时间,每个时间都有一个代表一周中几天的集合(最多七个)
ScheduleDay

Schedule
StartDateTime
EndDateTime

ScheduleDay
DayOfWeek (enum for Mon, Tues etc)
StartTime (time of day, expressed as minutes)
EndTime (time of day, expressed as minutes)
这允许时间段,如“2010年3月1日至2010年9月10日期间,每周二下午1点至3点”;e、 g.合理复杂但仍在形成模式的时间段

不过,这还是有点笨重。您真正想要的是甘特图的数据表示;形成时间间隔的“开”和“关”时段的集合

如果我设计这个系统,我会考虑存储一个一元函数,它需要一个<代码>日期时间>代码>并返回一个<代码> BOOL ,它描述给定的时间是否存在于时间段中。您的业务对象需要一个委托;如果(date.Year==2010)返回true,则可能是

,否则返回false
,或者它可能非常复杂,具体取决于所表示的时间段,但它允许完全扩展时间段(而不是限制可以表示什么)


不幸的是,我不知道如何在数据库中查询它,而且它显然不是POCO。

为什么不简单地存储开始和结束时间?是因为以后需要将其转换回常规文本吗?问题并不完全清楚。您是否在询问如何构建一个类层次结构,将这些概念呈现给开发人员,然后开发人员将使用这些类编写代码?如果是这样的话,那么根据两件事来驱动设计:(1)开发者想要操纵的不同类型的东西是什么,(2)这些东西之间的“是一种”关系是什么。你似乎在区分特定时间段(2010年4月1日)和非特定时间段(下午1:30到2:00,在哪一天?今天?任何一天?)。但我注意到,即使是你的特定时间段也不具体:一个时间需要一个时区来确定一个特定的时间点。(包括夏令时是否有效。)是4月1日凌晨12:01吗?可能是“4月”是在不同的时区测量的时间,而不是测试包含的日期。“4月”不是特别有趣;这与4月1日到4月30日相同。“2月”有趣的是,二月的天数会随着年份的变化而变化。让Eric来提醒我们与时间相关的数据操作到底有多复杂……事实确实如此!当然,这假设起点和终点总是与特定的单一时间点相关联。这个问题并不意味着这一点。我阅读的方式问题是,我得到的印象是,他想表达一些想法,如“任何一周的周一下午2点”或“任何一年的4月16日”@Timwi没错!这在我脑海中似乎不是一个模糊的问题……这个答案需要为每个不同的跨度创建单独的时间段。我想要一个代表一组规则的东西来应用于一系列日期。