Преобразуйте время UTC/GMT в местное время

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

291
задан Richard Everett 5 January 2014 в 20:53
поделиться

9 ответов

Я изучил бы использование Системы. Класс TimeZoneInfo, если Вы находитесь в.NET 3.5. См. http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx . Это должно принять во внимание изменения перехода на летнее время правильно.

// Coordinated Universal Time string from 
// DateTime.Now.ToUniversalTime().ToString("u");
string date = "2009-02-25 16:13:00Z"; 
// Local .NET timeZone.
DateTime localDateTime = DateTime.Parse(date); 
DateTime utcDateTime = localDateTime.ToUniversalTime();

// ID from: 
// "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zone"
// See http://msdn.microsoft.com/en-us/library/system.timezoneinfo.id.aspx
string nzTimeZoneKey = "New Zealand Standard Time";
TimeZoneInfo nzTimeZone = TimeZoneInfo.FindSystemTimeZoneById(nzTimeZoneKey);
DateTime nzDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, nzTimeZone);
119
ответ дан Noctis 23 November 2019 в 01:41
поделиться
TimeZone.CurrentTimeZone.ToLocalTime(date);
54
ответ дан George Johnston 23 November 2019 в 01:41
поделиться

Я был бы точно так же, как для добавления общих сведений осторожности.

, Если все Вы делаете, заставляет текущее время от внутренних часов компьютера помещать дату/время на дисплей или отчет, тогда все хорошо. Но если Вы сохранение информация о дате/времени для дальнейшего использования или вычисление дата/времена, остерегаетесь!

Скажем, Вы решаете, что круизное судно прибыло в Гонолулу 20 декабря 2007 в 15:00 UTC. И Вы хотите знать, какое местное время, которое было.
1. существует, вероятно, по крайней мере три вовлеченные 'местных жителя'. Локальный может означать Гонолулу, или это может означать, где Ваш компьютер расположен, или это может означать местоположение, где Ваш клиент расположен.
2. при использовании встроенных функций, чтобы сделать преобразование, это, вероятно, будет неправильно. Это вызвано тем, что летнее время находится (вероятно), в настоящее время в действительности на Вашем компьютере, но НЕ было в действительности в декабре. Но Windows не знает это... все, что он имеет, один флаг, чтобы определить, в настоящее время ли летнее время в действительности. И если это будет в настоящее время в действительности, тогда это счастливо добавит час даже к дате в декабре.
3. Летнее время реализовано по-другому (или нисколько) в различных политических подразделениях. Не думайте, что просто, потому что Ваша страна изменяется в определенную дату, что другие страны будут также.

14
ответ дан Mark T 23 November 2019 в 01:41
поделиться

Не забывайте, сделали ли Вы уже, чтобы DateTime возразил, и не уверены, является ли это UTC или Локальный, достаточно легко использовать методы на объекте непосредственно:

DateTime convertedDate = DateTime.Parse(date);
DateTime localDate = convertedDate.ToLocalTime();

, Как мы корректируемся в течение дополнительного часа?

, Если не определено .net будет использовать локальные настройки ПК. У меня было бы чтение: http://msdn.microsoft.com/en-us/library/system.globalization.daylighttime.aspx

взглядами код мог бы посмотреть что-то как:

DaylightTime daylight = TimeZone.CurrentTimeZone.GetDaylightChanges( year );

И, как упомянуто выше двойной проверки, какая установка часового пояса Ваш сервер идет. Существуют статьи о сети для того, как безопасно влиять на изменения в IIS.

4
ответ дан Brendan Kowitz 23 November 2019 в 01:41
поделиться

В ответе на предложение Dana:

пример кода теперь похож:

string date = "Web service date"..ToString("R", ci);
DateTime convertedDate = DateTime.Parse(date);            
DateTime dt = TimeZone.CurrentTimeZone.ToLocalTime(convertedDate);

исходная дата была 20.08.08; видом был UTC.

И "convertedDate" и "dt" являются тем же:

21.08.08 10:00:26; вид был локален

2
ответ дан nzpcmad 23 November 2019 в 01:41
поделиться

У меня была проблема с ним находиться в наборе данных, продвигаемом через провод (веб-сервис клиенту), что это автоматически изменится, потому что поле DataColumn's DateType было установлено на локальный. Удостоверьтесь, что Вы проверяете то, через что DateType то, если Ваше продвижение DataSets.

, Если Вы не хотите, чтобы он изменился, установите его на Неуказанный

1
ответ дан Miles 23 November 2019 в 01:41
поделиться

DateTime DTStamp = TimeZoneInfo. ConvertTimeFromUtc (система. DateTime. UtcNow, TimeZoneInfo. FindSystemTimeZoneById ("стандартное время Пакистана"));

0
ответ дан 23 November 2019 в 01:41
поделиться

Для таких строк, как 2012-09-19 01: 27: 30.000 , DateTime.Parse не может определить, в каком часовом поясе находятся дата и время. from.

DateTime имеет свойство Kind , которое может иметь один из трех вариантов часового пояса:

  • Unspecified
  • Local
  • Utc

NOTE If вы хотите представить дату / время, отличные от UTC или вашего местного часового пояса, тогда вам следует использовать DateTimeOffset .


Итак, для кода в вашем вопросе:

DateTime convertedDate = DateTime.Parse(dateStr);

var kind = convertedDate.Kind; // will equal DateTimeKind.Unspecified

Вы говорите, что знаете, какой это так, так что скажите ему.

DateTime convertedDate = DateTime.SpecifyKind(
    DateTime.Parse(dateStr),
    DateTimeKind.Utc);

var kind = convertedDate.Kind; // will equal DateTimeKind.Utc

Теперь, когда система знает свое время в формате UTC, вы можете просто позвонить ToLocalTime :

DateTime dt = convertedDate.ToLocalTime();

Это даст вам требуемый результат.

367
ответ дан 23 November 2019 в 01:41
поделиться

Я столкнулся с этим вопросом, так как у меня возникла проблема с датами UTC, которые вы возвращаете через twitter API (поле created_at в статусе); Мне нужно преобразовать их в DateTime. Ни одного из ответов / примеров кода в ответах на этой странице было недостаточно, чтобы я не получил ошибку «Строка не была распознана как допустимая дата и время» (но это самая близкая мне к поиску правильный ответ на SO)

Размещение этой ссылки здесь на случай, если это поможет кому-то другому - ответ, который мне был нужен, был найден в этом сообщении в блоге: http://www.wduffy.co.uk/blog/parsing-dates-when-aspnets-datetimeparse-doesnt -work / - в основном использовать DateTime.ParseExact со строкой формата вместо DateTime.Parse

1
ответ дан 23 November 2019 в 01:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: