我使用此代码将格式为“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代码中找到客户端时区,那么为什么使用这种复杂的方式??
…这种方法如何知道我的客户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
上使用Utc
、Local
或未指定
类型。另请注意,您应该在格式字符串中使用K
,而不是Z
。
更好的方法是使用DateTimeOffset
而不是DateTime
,在这种情况下,Z
将自动设置00:00
的偏移量。
不管你采取哪种方法,你仍然需要确定要转换到哪个时区。如果你碰巧正在编写在用户设备上运行的代码,那么你可以得到为你预定TimeZoneInfo. Local
的好处。否则你不会。