Работа с днями, которые не начинаются в полночь в NodaTime

Я работаю над приложением с расписанием поездов, где первый поезд отправляется в 04:00, а последний поезд отправляется в 02:00. Поэтому пользователи этого приложения имеют дело с днями, начинающимися в 03:00 и заканчивающимися в 03:00. Другими словами, когда они говорят " «Поезд в среду в 02:00» на самом деле означает «Поезд, который отправляется в четверг в 02:00».

Наше приложение должно хранить все поезда, отправляющиеся, например, в среду, а это значит, что оно не должно включать поезда, отправляющиеся до 03:00, но должно включать поезда, отправляющиеся на следующий день до 03:00.

Как бы я представил это в приложении, не сойдя с ума? И как это должно храниться в базе данных для удобства запросов?


person Marius    schedule 18.11.2013    source источник
comment
Обходным путем может быть сохранение смещения времени в базе данных, которое вы можете применить ко всем временам, чтобы эффективно нормализовать их до дня с 00:00 до 23:59.   -  person ChrisF    schedule 18.11.2013
comment
Вы должны сохранить его как UTC (изменение часа вызовет проблему). Вычитая 3 из часов, вы можете относиться к этому как к обычному дню.   -  person the_lotus    schedule 18.11.2013


Ответы (1)


Я бы сохранил фактическое значение даты/времени. Затем для запроса, чтобы найти «что-нибудь в среду», вы должны перейти от 04:00 среды (включительно) до 04:00 четверга (эксклюзивно).

Что касается отображения, вам, вероятно, лучше всего взять дату и вычесть день, если время раньше, чем какое-то отсечение:

private static readonly LocalTime CutOff = new LocalTime(4, 0, 0);

...
LocalDate date = dateTime.Date;
if (dateTime.TimeOfDay < CutOff)
{
    date = date.PlusDays(-1);
}
var dayOfWeek = date.IsoDayOfWeek;

Я бы постарался, насколько это возможно, не использовать дату сам по себе, чтобы не сойти с ума. Любая дата/время будет однозначной.

person Jon Skeet    schedule 18.11.2013
comment
Я бы постарался по возможности избегать использования даты отдельно, поэтому при сохранении дня в базе данных вы бы сохранили его как 2013-11-20T04:00:00Z вместо 2013-11-20T00:00:00? - person Marius; 18.11.2013
comment
@Marius: Не могли бы вы сохранить дату и время? Когда вам просто нужно сохранить дату? Однако, если вы должны хранить только дату, вам действительно следует хранить только дату, а не полночь в эту дату. - person Jon Skeet; 18.11.2013