2009-08-27 105 views
3

我只是想知道..只是日期或时间

我已经和反对这样

public class Entry{ 

public DateTime? Date { get; set;} // This is just Date 

public DateTime? StartTime { get; set; } //This is just Time 

public TimeSpan Duration { get; set; } //Time spent on entry 

} 

有没有更合适的类型比日期时间或者更好的策略来处理只是时间和日期?没有必须添加DateTime.MinDate()到我所有的开始和结束时间的痛苦?

---更新---

1 - 我喜欢能够请求,如果日期或开始时间是空seperartly条目对象。

2 - 输入应允许用户输入持续时间而不指示日期。即使像DateTime.MinDate()这样的默认日期看起来也是一种糟糕的设计。 (这就是为什么我选择TimeSpan不是开始和结束时间)

+3

当你的EndTime在第二天会发生什么? – ChrisF 2009-08-27 13:12:52

+0

你说得对Chris不好。在上面的例子中,我打出了endtime,只有Date,StartTime和Duration。好点 – BBorg 2009-08-27 13:19:59

+1

@Borg:在这种情况下,为什么不把'Date'属性完全抛弃,并且'StartTime'表示日期*和*时间。毕竟,这就是'DateTime'的用途! – LukeH 2009-08-27 13:21:38

回答

6

不要拆分存储数据的日期和时间组件。您可以提供的属性,如果你想提取那些:

public class Entry { 

    public DateTime StartPoint { get; set; } 
    public TimeSpan Duration { get; set; } 

    public DateTime StartDate { get { return StartPoint.Date; } } 
    public TimeSpan StartTime { get { return StartPoint.TimeOfDay; } } 
    public DateTime EndPoint { get { return StartPoint + Duration; } } 
    public DateTime EndDate { get { return EndPoint.Date; } } 
    public TimeSpan EndTime { get { return EndPoint.TimeOfDay; } } 

} 

更新:
如果你想拥有空值的日期和时间,你可以添加对性能,而无需拆分的日期和时间:

public class Entry{ 

    private DateTime _startPoint; 

    public bool HasStartDate { get; private set; } 
    public bool HasStartTime { get; private set; } 
    public TimeSpan Duration { get; private set; } 

    private void EnsureStartDate() { 
     if (!HasStartDate) throw new ApplicationException("Start date is null."); 
    } 

    private void EnsureStartTime() { 
     if (!HasStartTime) throw new ApplicationException("Start time is null."); 
    } 

    public DateTime StartPoint { get { 
     EnsureStartDate(); 
     EnsureStartTime(); 
     return _startPoint; 
    } } 

    public DateTime StartDate { get { 
     EnsureStartDate(); 
     return _startPoint.Date; 
    } } 

    public TimeSpan StartTime { get { 
     EnsureStartTime(); 
     return _startPoint.TimeOfDay; 
    } } 

    public DateTime EndPoint { get { return StartPoint + Duration; } } 

    public DateTime EndDate { get { return EndPoint.Date; } } 

    public TimeSpan EndTime { get { return EndPoint.TimeOfDay; } } 

    public Entry(DateTime startPoint, TimeSpan duration) 
    : this (startPoint, true, true, duration) {} 

    public Entry(TimeSpan duration) 
    : this(DateTime.MinValue, false, false, duration) {} 

    public Entry(DateTime startPoint, bool hasStartDate, bool hasStartTime, TimeSpan duration) { 
     _startPoint = startPoint; 
     HasStartDate = hasStartDate; 
     HasStartTime = hasStartTime; 
     Duration = duration; 
    } 

} 
+0

@Guffa我看不出如何轻松检查日期和时间是否为空分开? – BBorg 2009-08-27 13:46:31

+0

@Borg:正如你在我回答后添加了这个要求,我在上面添加了一个更新。 – Guffa 2009-08-27 16:45:16

+0

@Guffa ,,很好,我要测试这一点,但我认为这将工作得很好,TY – BBorg 2009-08-28 07:50:55

6

您可以使用TimeSpan作为您的StartTimeEndTime属性。这就是DateTime.TimeOfDay属性返回的结果。

还有DateTime.Date属性返回DateTime的时间元素设置为午夜。

说了这么多,我可能会建议完全抛弃你Date性能和存储全DateTime S(即日期时间)在StartTimeEndTime性能。

+1

我会建议同样的事情。你不需要Date属性。只需要StartTime和EndTime包含日期信息。 – 2009-08-27 13:21:00

+0

@ Meta-Knight;在这种特殊情况下,用例允许用户只输入Timespent而不显示日期或时间。然后在后面的用例中添加,但并非总是如此。 – BBorg 2009-08-27 13:32:43

+0

@Luke开船的问题总而言之,我无法检查是否设置了时间。由于00:00:00也是有效的开始时间 – BBorg 2009-08-27 14:06:25

1

你最好离开参考文献DateTime s。如果您只存储时间,那么当您的Entry跨越24小时以上时,您会遇到问题。将它们存储为DateTime,因为您现在拥有它们,并且只需将格式设置为最终用户的时间部分即可。

+0

耶chrisF也指出了我的例子中的这个弱点:-) – BBorg 2009-08-27 13:23:23

0

我想恭维Guffa's answer有两个最佳实践:

  1. 存储您所有的日期在数据库中的UTC的。
  2. 避免System.DateTime和favor System.DateTimeOffset
    1. SQL Server 2008的datetimeoffset类型相当于DateTimeOffset。
+0

@Jim G - 我很高兴答案也..但我不明白我将如何轻松检查日期如果我合并到两个属性,从时间(时间!=空)独立设置或不(日期!=空)? – BBorg 2009-08-27 14:07:28