Как конвертировать UTC + 0 Date в PST Date? - PullRequest
7 голосов
/ 09 декабря 2011

У меня есть этот UTC + 0 Дата:

2011-11-28T07:21:41.000Z

и я хотел бы, на C #, преобразовать его в дату PST. Как мне это сделать? Пробовал с:

object.Data.ToLocalTime()

но я не могу получить правильное значение (должно быть 2011-11-27)

EDIT

Также попробовал (после предложения по другой теме) это:

DateTime convertedDate = DateTime.SpecifyKind(
    DateTime.Parse(object.Data.ToShortDateString()),
    DateTimeKind.Utc);                    

DateTime dt = convertedDate.ToLocalTime();
string dataVideo = dt.ToShortDateString();

но дата все еще 28/11/2011, а не 27/11 / 2011

Ответы [ 2 ]

13 голосов
/ 09 декабря 2011

Я изменил свои часы, чтобы использовать UTC-08:00 Pacific Time.

DateTime timestamp = DateTime.Parse("2011-11-28T07:21:41.000Z");
Console.WriteLine("UTC: " + timestamp.ToUniversalTime());
Console.WriteLine("PST: " + timestamp.ToLocalTime());

Выход:

UTC: 28/11/2011 7:21:41
PST: 27/11/2011 23:21:41

Пример с TimeZoneInfo

DateTime timestamp = DateTime.Parse("2011-11-28T07:21:41.000Z");
Console.WriteLine("UTC: " + timestamp.ToUniversalTime());
Console.WriteLine("GMT+1: " + timestamp.ToLocalTime());
Console.WriteLine("PST: " + TimeZoneInfo.ConvertTimeBySystemTimeZoneId(timestamp, "Pacific Standard Time"));

Выход:

UTC: 28/11/2011 7:21:41
GMT+1: 28/11/2011 8:21:41
PST: 27/11/2011 23:21:41
2 голосов
/ 04 марта 2015

Еще немного цвета

2011-11-28T07:21:41.000Z

Это метка времени ISO8601, Z в конце обозначает UTC. Это представляет конкретный случай во времени.

DateTime.Parse вернет вам локальную структуру даты и времени, есть три типа даты и времени: UTC, Локальный и Не указано.

Если вы попытаетесь отобразить это, он покажет вам этот момент в текущем часовом поясе вашего компьютера (я восточное время, поэтому, когда я его распечатываю, я получаю 11/28/2011 2:21:41 AM).

Если я хочу переключить этот DateTime Kind на UTC, я мог бы сделать что-то вроде

DateTime.Parse("2011-11-28T07:21:41.000Z").ToUniversalTime()

Распечатав это сейчас (так как это сейчас UTC) я получаю 11/28/2011 7:21:41 AM.

Обратите внимание, что, хотя время печатается по-разному, оба эти значения даты относятся к одному и тому же моменту времени.

Чтобы отобразить этот момент в другом часовом поясе, самый простой способ imo - это класс TimeZoneInfo (хотя я не уверен, что он на 100% точен).

TimeZoneInfo.ConverTimeBySystemTimeZoneId(dateTime, "Pacific Standard Time").

Печать сейчас даст желаемый результат 11/27/2011 11:21:41 PM

Обратите внимание, что это возвращаемое свойство DateTime Kind теперь Unspecified, что означает, что вы не сможете перенести его обратно в UTC без дополнительной информации. У вас больше нет определенного момента времени, скорее, у вас есть неопределенное время ... мы знаем, что это тот же момент времени, что и раньше, в тихое время, но компьютер больше не знает этого. Имейте это в виду, если вы хотите сохранить это время.

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