Просто дата или время - PullRequest
       14

Просто дата или время

3 голосов
/ 27 августа 2009

Мне просто интересно ..

У меня есть и такой объект

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, или лучшая стратегия для обработки только времени и даты? Без необходимости добавлять DateTime.MinDate () ко всем моим временам начала и окончания?

--- обновление ---

1 - Мне нравится иметь возможность запрашивать, если Date или StartTime равно Null отдельно для объекта Entry.

2 - запись должна позволять пользователю вводить длительность без указания даты. Даже дата по умолчанию, такая как DateTime.MinDate (), выглядит как плохой дизайн. (Вот почему я выбираю TimeSpan, а не Start и EndTime)

Ответы [ 4 ]

6 голосов
/ 27 августа 2009

Не разделяйте компоненты даты и времени, в которых вы храните данные. Вы можете предоставить свойства для их извлечения, если вам нравится:

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

}
6 голосов
/ 27 августа 2009

Вы можете использовать TimeSpan для своих StartTime и EndTime свойств. Вот что возвращает свойство DateTime.TimeOfDay.

Существует также свойство DateTime.Date, которое возвращает DateTime с элементом времени, установленным в полночь.

Сказав это, я бы, вероятно, рекомендовал бы полностью исключить ваше свойство Date и хранить полные DateTime с (т.е. дату и время) в ваших StartTime и EndTime свойствах.

1 голос
/ 27 августа 2009

Вам гораздо лучше оставить свои ссылки как DateTime с. Если вы сохраняете только время, у вас есть проблемы, когда ваш Entry охватывает более 24 часов. Сохраните их как DateTime s, как они есть сейчас, и примените любое необходимое форматирование, чтобы представить конечному пользователю только часть времени.

0 голосов
/ 27 августа 2009

Я хотел бы дополнить Ответ Гуффы еще двумя лучшими практиками:

  1. Сохраните все ваши даты как UTC в базе данных.
  2. Избегайте System.DateTime и предпочитайте System.DateTimeOffset .
    1. Тип datetimeoffset в SQL Server 2008 является эквивалентом DateTimeOffset.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...