我有这个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日
答案 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。你不再有一个特定的时刻,而是你有一个未指定的时间..我们知道它与以前在太平洋时间的那个瞬间相同,但计算机不再知道这一点。如果您想要存储此时间,请记住这一点。