Ответ 1
Там нет ни одной встроенной функции, о которой я знаю, но все данные там, поэтому вы можете создать свой собственный.
Вы на правильном пути с тем, что вы показали, но есть несколько вещей, которые следует учитывать:
-
Обычно людей интересуют конечные точки интервалов. Возвращая начало и остановку только среднего интервала, вы, вероятно, получаете значения, отличные от ожидаемых. Например, если вы используете один из часовых поясов США, например
"America/Los_Angeles"
, ваша функция возвращает переходы как3/9/2014 3:00:00 AM
и11/2/2014 2:00:00 AM
, где вы, вероятно, ожидаете 2:00 AM для обоих. -
Часовые пояса к югу от экватора, которые используют DST, начнут его к концу года и закончат его к началу следующего года. Поэтому иногда элементы в кортеже могут быть отменены с того, что вы ожидаете от них.
-
Существует очень много часовых поясов, которые не используют летнее время, поэтому бросать исключение - не лучшая идея.
-
Есть как минимум два часовых пояса, которые в настоящее время имеют четыре перехода за один год (
"Africa/Casablanca"
и"Africa/Cairo"
) - с "перерывом" в свои периоды летнего времени для Рамадана. И иногда есть переходы, не связанные с DST, например, когда Самоа изменила стандартное отклонение в 2011 году, что дало ему три перехода за один год.
Учитывая все это, было бы лучше вернуть список точек одного перехода, а не набор пар переходов.
Кроме того, это незначительно, но лучше было бы не привязывать метод к системным часам вообще. Год может быть легко передан параметром. Затем вы можете использовать этот метод для не текущих лет, если это необходимо.
public IEnumerable<LocalDateTime> GetDaylightSavingTransitions(DateTimeZone timeZone, int year)
{
var yearStart = new LocalDateTime(year, 1, 1, 0, 0).InZoneLeniently(timeZone).ToInstant();
var yearEnd = new LocalDateTime(year + 1, 1, 1, 0, 0).InZoneLeniently(timeZone).ToInstant();
var intervals = timeZone.GetZoneIntervals(yearStart, yearEnd);
return intervals.Select(x => x.IsoLocalEnd).Where(x => x.Year == year);
}
Также обратите внимание на конец, важно фильтровать только значения, которые находятся в текущем году, потому что интервалы могут очень распространяться на следующий год или продолжаться бесконечно.