Проблема с приложением, зависящим от британского летнего времени в Azure

Часть локального приложения, которое я перемещаю в облако, отображает информацию о расписании телепередач из источника json. Основные данные используют смещение в секундах от даты начала, чтобы получить время начала, и это нормально, поскольку все они имеют формат int UTC.

Проблема возникает при движении в облако.

Локальное приложение было расположено в Великобритании, поэтому локаль — UntedKingdom, а время телепередач правильно выводилось с использованием

return programmeStart.AddHours(programmeStart.IsDaylightSavingTime() ? 1 : 0);

Однако после перемещения в облако функция IsDaylightSavingTime больше не возвращает значение true из-за того, что центры обработки данных не зависят от BST.

Ломала голову, как бы попытаться разобраться в этом.

Есть ли быстрый и простой способ установить, в какой локали работает ваша размещенная служба в Azure, или это лучшее решение для создания метода расширения, который считывает границы того, когда BST запускается от и до, а затем возвращает true или false оттуда для пример

public static class DateTimeExtension
{
  public static bool IsMyDaylightSavingTime(this DateTime timeToTest)
  {
    if(timeToTest >= GetConfig("bstStart") && timeToTest <= GetConfig("bstFinish"))
    {
      return true;
    }

    return false;
  }
}

И как поддерживать значения конфигурации bst при перемещении?

Спасибо


person Brett    schedule 20.05.2011    source источник


Ответы (2)


Вы не можете изменить часовой пояс серверов Azure — многие процессы предполагают, что UTC является текущей настройкой.

Вы должны иметь возможность получить информацию о часовом поясе Великобритании по строке, например:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");

После того, как вы это сделаете, вы можете использовать метод фреймворка TimeZoneInfo.IsDaylightSavingTime http://msdn.microsoft.com/en-us/library/bb460642.aspx

tzi.IsDaylightSavingTime(DateTime.Now);
person Stuart    schedule 20.05.2011
comment
Ура, Стюарт! Ушли на programmeStart.AddHours(TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time").IsDaylightSavingTime(programmeStart) ? 1 : 0); - person Brett; 23.05.2011
comment
Зачем вам кодировать 1 или 0, когда у вас есть смещение? ProgramStart.AddHours(TimeZoneInfo.FindSystemTimeZoneById(GMT Standard Time).GetUtcOffset(DateTime.UtcNow)) имеет гораздо больше смысла. Не только ясно, что вы добавляете, но и в будущем, если смещение изменится в какой-то момент. Кстати, снимать баллы за ответ не очень приятно, когда я уже указал вам на него, и вы идете и принимаете тот же ответ от кого-то другого. - person dunnry; 23.05.2011
comment
Все наши проблемы ничто по сравнению с тем, о чем придется думать программистам Самоа - telegraph.co.uk/news/worldnews/australiaandthepacific/samoa/ :) Я добавил +1 к другому ответу, чтобы попытаться успокоить ситуация. В идеальном решении, я думаю, я бы использовал сочетание двух ответов - я бы использовал FindSystemTimeZoneById из этого ответа и GetOffset из ответа Даннри. - person Stuart; 24.05.2011

Почему вы не можете просто вернуть UTC и позволить клиенту перевести это в соответствии с его локалью?

Изменить: вот код

var offset = TimeZoneInfo.GetSystemTimeZones()
.Where(z => z.Id == "GMT Standard Time")
.Single()
.GetUtcOffset(DateTime.UtcNow)
person dunnry    schedule 20.05.2011
comment
В телепередачах для начала программы должно быть указано время в Великобритании, поэтому перевод времени клиента на самом деле не вариант. - person Brett; 20.05.2011
comment
Итак, я полагаю, вы могли бы использовать класс TimeZoneInfo и запросить конкретный часовой пояс, который вы ищете, чтобы сделать это тогда. См. этот метод: msdn.microsoft.com/en-us/ библиотека/ - person dunnry; 20.05.2011