将US-Style DateTime转换为本地时间

时间:2013-04-21 15:23:07

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

如何将从服务器返回的美式DateTime(例如5/1/2012 3:38:27 PM)转换为用户的本地时间?我正在开发Windows手机。

我试过

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

2 个答案:

答案 0 :(得分:1)

为此,DateTime - 对象serverTime必须是UTC格式 - 或者至少知道Kind是什么。在this page.

备注部分下阅读有关此内容的所有详细信息

祝你好运!

答案 1 :(得分:0)

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

// 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

这样做非常重要,因为当夏令时结束时,当地时间可能会模棱两可。您必须提供正确的偏移量(对于PST为-8,对于PDT为-7),或者以UTC格式发送。

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