如何将UTC + 0日期转换为PST日期?

时间:2011-12-09 08:22:58

标签: c# datetime

我有这个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();

但日期仍为2011年11月28日,而不是2011年11月27日

2 个答案:

答案 0 :(得分:13)

我已将时钟更改为使用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

答案 1 :(得分:2)

多一点颜色

2011-11-28T07:21:41.000Z

这是ISO8601时间戳,最后的Z代表UTC。这代表了一个特定的实例。

DateTime.Parse会返回一个本地日期时间结构,有三种类型的日期时间类型,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。你不再有一个特定的时刻,而是你有一个未指定的时间..我们知道它与以前在太平洋时间的那个瞬间相同,但计算机不再知道这一点。如果您想要存储此时间,请记住这一点。