2011-12-09 172 views
7

我有这个UTC + 0日期:如何将UTC + 0日期转换为PST日期?

2011-11-28T07:21:41.000Z 

,我想,在C#中,将其转换为PST日期。我该怎么做?试着用:

object.Data.ToLocalTime() 

,但我不能得到正确的值(应为2011-11-26)

编辑

也试过(另一个话题suggesion后)这一点:

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

+0

检查此问题:http://stackoverflow.com/questions/179940/c-sharp-convert-utc-gmt-time-to-local-time – Nayan

+0

尝试了一些策略,如'DateTime.Parse(object。 Data.ToShortDateString())。ToLocalTime()'但没有任何反应...... – markzzz

+0

我没有看到失败模式,只有一个:检查你的机器实际上是否在PST时区。记录你得到的时间,而不仅仅是日期。 –

回答

11

我已经改变了我的时钟使用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 
+0

首先,我不能放弃Z(我不会在日期上获得一个字符串替换,这太可怕了)。其次,不,它没有办法诀窍:日期仍然是28/11/2011,在PST上是2011年2月27日(前12小时)。 – markzzz

+1

没关系丢Z.我已经更新了答案。据我所知,PST是UTC-08:00,而不是UTC-12:00? – Stijn

+0

:O!但我需要打印该值,而无需更改计算机的时钟:)是否有将UTC(我的日期)中的某个日期转换为PST日期的方法?是的,对不起,是UTC-08:00,UTC-12:00应该是PDT ... – markzzz

1

多一点色彩

2011-11-28T07:21:41.000Z

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

DateTime.Parse将返回给您一个本地日期时间结构,有三种类型的日期时间类型,UTC,本地和未指定。

如果你尝试显示这个,它会告诉你这个瞬间在你的电脑当前时区(我是东部时间,所以当我打印它时,我得到11/28/2011 2:21:41 AM)。

如果我想这个日期Kind切换到UTC,我可以做类似

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

印刷本,现在(因为它是一种现在UTC)我得到11/28/2011 7:21:41 AM

请注意,虽然时间打印的方式不同,但这两个日期时间都指的是同一时间点。

要在不同的时区显示此即时信息,最简单的方法是TimeZoneInfo类(尽管我不确定它是否100%准确)。

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

现在打印它会产生你想要的结果11/27/2011 11:21:41 PM

注意,这回的DateTime的Kind属性现在Unspecified,这意味着你将无法将其传送回UTC没有更多的信息。你不再有特定的时间,而是你有一个不确定的时间..我们知道它和以前刚刚在太平洋时间的瞬间是一样的,但电脑不知道这一点。记住这一点,如果你想这次存储。