提问者:小点点

ParseExact如何知道我的本地时区?


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

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:26PM}这是我的本地时间(客户端时区)。换句话说,DateTime.ParseExact将PurchaseDate转换为我的客户端时区!我的问题是这个方法是如何知道我的客户端时区的?是否建议将其用于全局应用程序并显示用户时区??

更新我的问题:

有时在我的全球网站上实施时区管理,我用谷歌搜索它以获取可能的解决方案,我发现这个使用完整链接:

如何在客户端时区中显示日期和时间

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


共1个答案

匿名用户

…这种方法如何知道我的客户TimeZone?

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

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

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

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)并决定是否在生成的DateTime上使用UtcLocal未指定类型。另请注意,您应该在格式字符串中使用K,而不是Z

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

不管你采取哪种方法,你仍然需要确定要转换到哪个时区。如果你碰巧正在编写在用户设备上运行的代码,那么你可以得到为你预定TimeZoneInfo. Local的好处。否则你不会。