ParseExact如何知道我的本地TimeZone?

时间:2017-12-12 17:48:39

标签: c# date datetime timezone-offset

我使用此代码将格式为“yyyy-MM-ddTHH:mm:ssZ”的UTC字符串Time转换为日期时间。例如:

string PurchaseDate == "2017-12-12T14:29:26Z";
datetime dt =  DateTime.ParseExact(PurchaseDate , "yyyy-MM-ddTHH:mm:ssZ", null);

我知道PurchaseDate时间是UTC时间(因为“Z”)。 dt返回{12/12/2017 5:59:26 PM}这是我当地的时间(客户时区)。换句话说DateTime.ParseExact将PurchaseDate转换为我的客户时区!我的问题是这个方法如何知道我的客户端TimeZone?是否建议将其用于全局应用并显示用户时区?

更新我的问题:

在我的全球网站上实施时区管理的某个时候我谷歌搜索可能的灵魂,我发现这个使用完全链接:

How to display dates and times in clients timezone

月后我发现我们可以使用TimeZoneInfo.Local来寻找时尚的TimeZone! 所以我应该说链接没用?我想知道是否有一种简单的方法可以在dotNet BackEnd代码中找到客户端时区,为什么会使用这种复杂的方法?

1 个答案:

答案 0 :(得分:1)

  

...这个方法如何知道我的客户端TimeZone?

它对“客户”一无所知。它只有代码运行的本地时间。如果代码在用户的台式计算机或移动设备上运行,那么它就是该设备的时区。

如果代码在服务器上运行,则它使用服务器的时区。您应该避免这种情况,因为服务器的时区通常与您的应用程序或用户无关。这同样适用于TimeZoneInfo.Local

如果要将字符串解析为UTC DateTime,那么您需要传递一个参数,告诉解析器不要转换为本地时间:

string PurchaseDate = "2017-12-12T14:29:26Z";
DateTime dt = DateTime.ParseExact(PurchaseDate, "yyyy-MM-ddTHH:mm:ssK",
                               CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("...you'll need to decide...");
DateTime clientDateTime = TimeZoneInfo.ConvertTimeFromUtc(dt, tz);

在上面,我使用DateTimeStyles.RoundtripKind来表示评估字符串的偏移量(在这种情况下为Z)并决定是否使用UtcLocal ,或Unspecified对结果DateTime有所帮助。另请注意,您应在格式字符串中使用K,而不是Z

更好的方法是使用DateTimeOffset代替DateTime,在这种情况下,Z会自动设置+00:00的偏移量。

无论采用哪种方式,您仍需要确定要转换为的时区。如果您正在编写在用户设备上运行的代码,那么您将获得为您预先安排TimeZoneInfo.Local的好处。否则你不会。