Правильное время работы с NodaTime - программирование
Подтвердить что ты не робот

Правильное время работы с NodaTime

В настоящее время я пишу довольно простое приложение, которое открывает время открытия/закрытия бизнеса и сталкивается с серьезными трудностями, пытаясь понять, как правильно хранить информацию.

Большая часть нашей критической функциональности в значительной степени зависит от времени получения абсолютно совершенной, поэтому, очевидно, я хочу, чтобы все было сделано наилучшим образом, чтобы начать с!

Кроме того, данные будут вводиться пользователями, поэтому, если базовое представление немного сложнее (например, используя TimeSpans для учета открытия за полночь), это должно быть невидимым для пользователя.

Мне нужно сначала сохранить часы работы, по дням недели, связанный с ними часовой пояс, например:

- M:  1000 - 2330
- T:  1000 - 0030
- W:  1900 - 0300
- Th: 2000 - 0300
- F:  2000 - 0800
- Sa: 1000 - 0500
- Su: 1000 - 2300

В настоящее время я думаю, что лучший способ сохранить это - использовать такой класс:

public class OpeningHours
{
    ZonedDateTime OpeningTime { get; set; }
    Period durationOpen { get; set; }

    // TODO: add a method to calculate ClosingTime as a ZonedDateTime
}

Однако здесь есть два основных осложнения:

  • Я не хочу хранить год, месяц или дату в ZonedDateTime - мне просто интересно, как DayOfWeek.

    Конечно, я мог бы просто сохранить каждое значение в качестве первого понедельника/вторника и т.д. после 1 января 1970 года, но это кажется взломанным и в значительной степени неправильным - как автор NodaTime, очень правильно, объясняет здесь, когда речь идет об ограничениях реализации BCL DateTime. У меня также есть чувство, что это, вероятно, закончится странными причудливыми ошибками, если позже мы попытаемся выполнить любую арифметику с датами.

  • Пользователь все равно должен будет ввести ClosingTime. На стороне клиента, я полагаю, я мог бы сделать что-то простое, как всегда предполагать, что ClosingTime на следующий день, если он до открытия, но еще раз, он не идеален, а также не учитывает места, которые могут быть открыты более 24 часов (например, супермаркеты)

Еще одна вещь, которую я рассмотрел, - это использовать таблицу с часами/днями и позволять людям выделять часы недели, чтобы выбрать время открытия, но вы все равно сталкиваетесь с той же проблемой, только имея желание сохранить часть DayOfWeek в приложении "Время в пути".

Любые предложения будут оценены, потратив последние 6 часов на чтение о смехотворно глупых способах, которые мы, люди, представляем, время сожгли меня немного!

4b9b3361

Ответ 1

Я бы сильно подумал использовать LocalTime вместо ZonedDateTime по двум причинам:

  • Вы не пытаетесь представить один момент времени; это естественно повторяющиеся шаблоны (нет соответствующей даты)
  • Вы не пытаетесь справиться с ситуацией, когда магазин находится в разных часовых поясах для разных часов работы; вы, вероятно, хотите связать часовой пояс с каждым хранилищем один раз, а затем вы можете применить этот часовой пояс, когда захотите

Итак, у меня было бы что-то вроде этого (показывая только члены данных, как вы разбираете поведение - это отдельный вопрос):

public class StoreOpeningPeriod
{
    IsoDayOfWeek openingDayOfWeek;
    LocalTime openingTime;
    LocalTime closingTime;
}

Обратите внимание, что это точно соответствует вашим исходным данным, как вы его показали, что всегда является хорошим знаком - вы не добавляете и не теряете информацию, а предположительно в удобной форме.

Если время закрытия более раннее, чем время открытия, он предположил, что это пересекло полночь - вы можете добавить окно подтверждения для пользователя, если это относительно редко, но это, безусловно, легко обнаружить и обработать в коде.