【问题标题】:How to convert UTC+0 Date to PST Date?如何将 UTC+0 日期转换为 PST 日期?
【发布时间】:2012-01-16 14:08:02
【问题描述】:

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

【问题讨论】:

  • 尝试了一些策略,例如DateTime.Parse(object.Data.ToShortDateString()).ToLocalTime(),但没有任何反应...
  • 我没有看到故障模式,但有一个:检查您的机器是否实际上处于 PST 时区。记录你得到的时间,而不仅仅是日期。
  • 那么,您的计算机上设置了哪个时区? @Stijn 建议的解决方案应该可以工作。

标签: c# datetime


【解决方案1】:

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

【讨论】:

  • 首先,我不能删除 Z(我不会在 Date 上替换字符串,这太可怕了)。其次,不,它不起作用:日期仍然是 28/11/2011,在 PST 上是 27/11/2011(12 小时前)。
  • 没关系放弃 Z。我已经更新了答案。据我所知,PST 是 UTC-08:00,而不是 UTC-12:00?
  • :哦!但是我需要在不更改计算机时钟的情况下打印该值:) 有没有一种方法可以将 UTC(我的日期)中的某个日期转换为 PST 日期?是的,抱歉,是 UTC-08:00,UTC-12:00 应该是 PDT...
  • @markzzz 是的,您需要使用 TimeZoneInfo 类,但它仅适用于 .NET 3.5+。
  • 是的,我有 .NET 3.5。我如何使用 TimeZoneInfo 来做到这一点?可以举个例子吗?
【解决方案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。你不再有一个特定的时刻,而是你有一个未指定的时间..我们知道它与以前的太平洋时间相同,但计算机不再知道这一点。如果您想存储这个时间,请记住这一点。

【讨论】:

    猜你喜欢
    • 2021-11-10
    • 2020-11-21
    • 2011-08-29
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    相关资源
    最近更新 更多