Извините, если это кажется простым вопросом, но я в основном просто хочу проверить, что решение, которое у меня есть, является наиболее разумным/выполняется для всех случаев.Каков наилучший способ найти последний возможный момент LocalDate в конкретном часовом поясе?
Предварительно существующая база данных SQL Server, с которой мы работаем, сохраняет значения «период» как включительно start -> inclusive end UTC DateTime. (Оба начала & концевые столбцы: datetime2(7)
, автоматически преобразуются в System.DateTime
экземпляров DateTimeKind.UTC
, прежде чем мы начнем с ними работать).
Так что, если мне нужно хранить «весь день/месяц/год, с учетом часового пояса пользователя» Мне нужно найти «последний возможный момент, заданного LocalDate, в частности DateTimeZone».
Методов У меня есть следующие:
public static LocalDateTime AtEndOfDay(this LocalDate localDate)
{
return localDate
.PlusDays(1)
.AtMidnight()
.PlusTicks(-1);
}
public static ZonedDateTime AtEndOfDay(this DateTimeZone zone, LocalDate localDate)
{
return zone
.AtStartOfDay(localDate.PlusDays(1))
.Plus(Duration.FromTicks(-1));
}
Я думаю, что также нужно избегать (в другом месте) отображение «конца дня» LocalDateTime
с помощью .AtLeniently(..)
, так как если 23: 59: 59,9999999 является «пропущено »и не существует в целевом DateTimeZone
, тогда он будет отображаться в следующий доступный момент на« внешней »стороне зазора 00: 00: 00.000000, что даст мне значение ZonedDateTime
.
Измененный Методы:
public static LocalDateTime AtEndOfDay(this LocalDate localDate)
{
// TODO: Replace with localDate.At(LocalTime.MaxValue) when NodaTime 2.0 is released.
return localDate
.PlusDays(1)
.AtMidnight()
.PlusTicks(-1);
}
public static ZonedDateTime AtEndOfDay(this DateTimeZone zone, LocalDate localDate)
{
return zone
.AtStartOfDay(localDate.PlusDays(1))
.Plus(-Duration.Epsilon);
}
public static ZonedDateTime AtEndOfDayInZone(this LocalDate localDate, DateTimeZone zone)
{
return zone.AtEndOfDay(localDate);
}
Я бы почти всегда рекомендовал вместо этого использовать полуоткрытый интервал (включительно начало, эксклюзивный конец). Значения, которые вам нужны, намного проще вычислять. То естьвам не нужно компенсировать разрешение/точность, в которой хранятся значения даты и времени (на протяжении всего их путешествия через ваш код), чтобы гарантировать, что вы всегда получили «последний возможный момент» –
Я знаю, что существуют противоречивые мнения о том, как хранить интервалы, но, как я уже упоминал в своем вопросе, я работаю с существующей системой и изменяю все, что нужно, это не вариант. –
Извините, я не имею в виду, что я не вижу выгоды или не хочу _want_ изменять структуру БД, у меня просто нет этого в качестве опции прямо сейчас :) –