2009-08-27 4 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 

} 

같은 객체

단지 처리 시간 및 날짜에 날짜 시간보다 더 적절한 유형 또는 더 나은 전략이 있는가? 모든 StartTime과 EndTime에 DateTime.MinDate()를 추가해야하는 번거 로움없이?

--- 갱신 ---

1 - 나는 날짜 또는 상영이 엔트리 객체에 seperartly null의 경우 요청할 수 좋아한다.

2 - 사용자는 날짜 표시없이 기간을 입력 할 수 있어야합니다. DateTime.MinDate() 같은 기본 날짜조차도 잘못된 디자인처럼 보입니다. (이것이 내가 StartTime과 EndTime이 아닌 TimeSpan을 선택한 이유입니다)

+3

EndTime이 다음 날인 경우 어떻게됩니까? – ChrisF

+0

오른쪽 Chris 나쁜 시나리오. 위의 예에서 나는 endtime을 치고 오직 Date, StartTime과 Duration 만 가진다. 좋은 점 – BBorg

+1

@BBorg :이 경우 왜'Date' 속성을 버리고'StartTime'을 날짜 *와 * 시간으로 표현하지 않을까요?결국, 그것은 'DateTime'이 무엇을위한 것입니까! – LukeH

답변

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; } } 

} 

업데이트 :
날짜와 시간을 분할하지 않고 날짜와 시간, 당신이 그 속성을 추가 할 수 있습니다 null 값을 갖고 싶어 :

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

+0

@BBorg : 내가 대답 한 후에 해당 요구 사항을 추가 했으므로 위의 업데이트를 추가했습니다. – Guffa

+0

@ Guffa, nice, 나는 이것을 약간 테스트 할 것이지만 이것이 잘 동작 할 것이라고 생각한다. TY – BBorg

6

StartTimeEndTime 속성에는 TimeSpan을 사용할 수 있습니다. 이것이 DateTime.TimeOfDay 속성이 반환하는 것입니다.

시간 요소를 자정으로 설정하고 DateTime을 반환하는 DateTime.Date 속성도 있습니다.

은 아마 모두 당신의 Date 속성을 죽겠다 전체 DateTime의를 저장하는 것이 좋습니다했다 가졌 (즉, 날짜 시간) 당신의 StartTimeEndTime 속성이다.

+1

나는 똑같은 것을 제안 할 것이다. Date 속성은 필요하지 않습니다. StartTime과 EndTime에 날짜 정보가 포함되어 있으면됩니다. –

+0

@ Meta-Knight; 이 특별한 경우에 유스 케이스는 사용자가 날짜 나 시간을 표시하지 않고 Timespent를 입력하는 것을 허용합니다. 나중에 사용 케이스가 추가되지만 항상 그런 것은 아닙니다. – BBorg

+0

@Luke Ditching Date와 관련된 문제는 시간이 설정되었는지 여부를 확인할 수 없습니다. 00:00:00 이후로 유효한 시작 시간입니다 – BBorg

1

참고 문헌을 DateTime로 두는 것이 훨씬 좋습니다. 시간 만 저장하면 Entry이 24 시간 이상 지속될 때 문제가 발생합니다. 지금 가지고 계신대로 이것을 DateTime으로 저장하고 시간 부분을 나타내는 데 필요한 형식을 최종 사용자에게 적용하십시오.

+0

yeah chrisF도 내 예제에서이 약점을 지적했다. :-) – BBorg

0

나는 두 개 더 모범 사례 Guffa's answer을 칭찬하고 싶습니다 : 데이터베이스에있는 UTC와 같은 날짜의

  1. 스토어 모두를.
  2. System.DateTime 및 favor System.DateTimeOffset을 피하십시오.
    1. SQL Server 2008의 datetimeoffset 형식은 DateTimeOffset과 같습니다.
+0

@Jim G - Im에 대한 답변도 행복하다. 그러나 나는 Date를 쉽게 체크 할 수 있는지 보지 못한다. seted or not (Date! = null) seperatly time (Time! = null) 내가 두 개의 속성에 병합한다면? – BBorg