【问题标题】:Convert US-Style DateTime to local time将 US-Style DateTime 转换为本地时间
【发布时间】:2013-04-21 15:23:07
【问题描述】:

如何将服务器返回的5/1/2012 3:38:27 PM等美式DateTime转换为用户本地时间?我正在为 windows phone 开发。

我试过了

DateTime localTime = serverTime.ToLocalTime();

但结果是关闭了几个小时。我认为ToLocalTime() 会负责转换到用户所在的任何时区?也许我需要先获取用户的时区信息?

编辑 1

我认为 serverTime 在 PST 时区

编辑 2

我的时区是 GMT +8。我尝试了以下方法,但结果 localTime 落后了 15 小时。

TimeZoneInfo localZone = TimeZoneInfo.Local;
DateTime localTime = TimeZoneInfo.ConvertTime(serverTime, localZone);

编辑 3

这会比我的当地时间晚 7 小时。

TimeZoneInfo localZone = TimeZoneInfo.Local;
DateTime dateTimeKind = DateTime.SpecifyKind(serverTime, DateTimeKind.Utc);
DateTime localTime = TimeZoneInfo.ConvertTime(dateTimeKind, localZone);

编辑 4

好的,我想我快到了,但不确定这是否适用于所有时区。我想我仍然需要考虑夏令时,因为由此产生的当地时间现在只提前一小时。

TimeZoneInfo localZone = TimeZoneInfo.Local;
double offset = localZone.GetUtcOffset(DateTime.Now).TotalHours;
DateTime dateTimeKind = DateTime.SpecifyKind(serverTime, DateTimeKind.Utc);
DateTime localTime = TimeZoneInfo.ConvertTime(dateTimeKind, localZone).AddHours(offset);

但是,如何让DLS 在 Windows Phone 中的特定时区生效? TimeZoneInfo.FindSystemTimeZoneById 好像不支持?

【问题讨论】:

  • 你看过这篇文章吗?它有很多关于 ToLocalTime 和时间问题的有用信息。 stackoverflow.com/questions/179940/…可能重复
  • 我用什么格式接收服务器时间?
  • DateTime 格式是美国风格,在 PST 时区

标签: c# datetime windows-phone-8 localtime


【解决方案1】:

为此,DateTime-object serverTime 必须是 UTC 格式 - 或者至少知道 Kind它是什么。阅读this page.

remarks部分下的所有详细信息

祝你好运!

【讨论】:

    【解决方案2】:

    时间代表什么?如果是特定的时间点,例如发生某事的日期和时间,那么您应该更新您的服务器代码,以下列格式之一返回时间:

    // ISO8601 local time with offset.
    // get from DateTimeOffset.ToString("o")
    2012-05-01T15:38:27-07:00
    
    // ISO8601 UTC time
    // get from DateTime.ToString("o") when kind is UTC
    2012-05-01T22:38:27Z
    

    执行此操作非常重要,因为夏令时结束时当地时间可能不明确。您必须提供正确的偏移量(-8 表示 PST,-7 表示 PDT),或以 UTC 格式发送。

    在极少数情况下单独发送本地时间是有意义的。如果你认为你有一个,请详细说明时间代表什么。

    【讨论】:

    • 时间表示服务器收到字符串(聊天消息)的时刻。不幸的是,我无权访问服务器来更改那里的代码。无论如何,我最终没有转换为本地时间,而是获取服务器本地时间并计算上次发布消息的时间,例如 5 mins ago2 hours ago
    • @PutraKg - 请注意,您将在 11 月 3 日凌晨 1:00 到凌晨 2:00 有歧义,此时偏移量可能是 -7 或 -8,您将无法知道它是哪一个。如果这对您很重要,那么您应该与负责服务器代码的人员进行讨论。
    • 如果你从服务器时间中减去,那么你可能会得到一个负值,或者一个额外的小时(在 3 月 10 日或 11 月 3 日)。您的代码应该准备好处理歧义或负值的可能性。
    • 你是对的,感谢您的提醒。我会与他们取得联系,询问如何最好地处理这种情况。
    猜你喜欢
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2022-12-05
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多