Как преобразовать дату UTC+0 в дату PST?

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

2011-11-28T07:21:41.000Z

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

object.Data.ToLocalTime()

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

редактировать

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

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 ответов


Я изменил свои часы, чтобы использовать 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

Для немного больше цвета

2011-11-28T07:21:41.000Z

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

DateTime.Parse вернет вам локальную структуру времени даты, есть три типа видов datetime, UTC, Local и Unspecified.

если вы попытаетесь отобразить это, он покажет вам этот момент в текущем часовом поясе ваших компьютеров (я восточное время, поэтому, когда я печатаю его, я получаю 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 без дополнительной информации. У вас больше нет определенного момента времени, скорее у вас есть неопределенное время..мы знаем, что это то же самое мгновение, что и раньше, только по тихоокеанскому времени, но компьютер больше этого не знает. Имейте это в виду если ты хочешь сохранить это время.