.NET: Получение UTC DateTime от даты со смещением по Гринвичу - PullRequest
3 голосов
/ 18 апреля 2011

У меня есть четыре целых числа:

  • День месяца (1 - 31)
  • Месяц года (1 - 12)
  • год
  • Час дня (0 - 23)

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

К счастью, у меня есть смещение по Гринвичу их местоположения на земле. Это десятичное число.

Как мне взять эти четыре целых числа плюс десятичное смещение по Гринвичу и получить DateTime в UTC, который представляет их?

Чтобы ответить на этот вопрос, заполните тело метода этой функции:

public static DateTime UtcDateTime (int день, int месяц, int год, int час, десятичное значение gmtOffset) { // сделать }

Ответы [ 2 ]

3 голосов
/ 18 апреля 2011

Я бы рекомендовал использовать DateTime в сочетании с TimeZoneInfo .Вы можете хранить время UTC на своем сервере и конвертировать время для каждого пользователя, используя его TimeZoneInfo.TimeZoneInfo может быть установлен пользователем, или вы можете каким-то образом извлечь его из настроек Windows, если это возможно.Мы просим пользователей установить их TimeZoneInfo (через раскрывающийся список) на странице их настроек.

Обновление

В то время как Microsoft заявляет в MSDN, что мы должны использоватьDateTimeOffset вместо DateTime есть некоторые проблемы при использовании DateTimeOffset.Я не смог сериализовать / десериализовать экземпляры DataTimeOffset, передавая их через WCF.И DateTime / TimeZoneInfo работает отлично.Мне очень нравится DateTimeOffset, но он до сих пор не подходит для реальных приложений.

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

Обновление

Вот вы:

private static DateTime ToUTC(int day, int month, int year, int hour, decimal utcOffset)
{
    TimeSpan offset = TimeSpan.FromMinutes((double)(utcOffset * 60)); // time zone offset is always aligned to minutes
    return new DateTimeOffset(year, month, day, hour, 0, 0, offset).ToUniversalTime().DateTime;
}
1 голос
/ 18 апреля 2011

Вы должны использовать DateTimeOffset.

Преобразовать десятичную дробь в требуемую точность, а затем построить, как показано ниже (с использованием FromSeconds в качестве примера):

new DateTimeOffset (год, месяц, день, час, 0,0, TimeSpan.FromSeconds (смещение);

http://msdn.microsoft.com/en-us/library/system.datetimeoffset(v=VS.90).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...