我有一个以下格式的字符串:
14:41:21 Dec 15, 2015 PST
我想把它转换成我服务器的本地时间,但我认为我正在创建一个可以避免的额外步骤:
Dim testdate As Date
DateTime.TryParseExact(dateinput, "HH:mm:ss MMM dd, yyyy PST", CultureInfo.InvariantCulture, DateTimeStyles.None, testdate)
testdate = TimeZoneInfo.ConvertTimeToUtc(testdate, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"))
testdate = testdate.ToLocalTime()
我一直在考虑这个问题,但无论哪种方式,我都会休息几个小时,以上是我发现的有效方法,但我只是想知道是否有更好的方法。还要注意的是,它可以部署在多个服务器上,所以我不想指定时区来显式地将其转换为本地时间。
几件事:
-
如果要在格式字符串中包含固定文本,请将其放在单引号中,这样它就不会被误解为格式标记。(
'PST'
) -
在一般情况下,时区缩写只能用于显示目的。它们不应该被解析为输入,因为它们可能是不明确的。例如,对
CST
有5种不同的解释。它可能是美国中央标准时间,但也可能是中国标准时间,或其他标准时间。请参阅维基百科上的列表。 -
如果您想要支持的时区缩写数量有限,那么您可以从字符串中提取它,并使用字典、select/case语句或条件逻辑来映射它们。只要确定你知道你想要支持的一整套缩写,以及你想要它们映射到哪个时区。还要确保考虑到夏令时缩写,如
PDT
。 -
请注意,一些较旧的标准,如RFC 2822§4.3,确实对一些缩写进行了硬编码,因此如果您正在解析该特定格式,则可以选择支持这些缩写。(你的很相似,但不太匹配。)
-
您的代码基本上是可以的,但您可能应该检查
TryParseExact
的结果。否则,您还可以使用ParseExact
,它将在失败时抛出异常,而不仅仅是返回false。 -
如果您想在一个步骤中进行转换,可以使用
ConvertTime
和TimeZoneInfo.Local
作为目标区域。代码会稍微小一些,但不会有技术上的差异。 -
你确定你真的想这么做吗?依赖系统的本地时区通常不应该在基于服务器的应用程序中完成。这更适合台式机和移动设备。一般来说,服务器端代码不应该依赖于系统时区来做任何特别的事情。避免";当地时间";API,包括
DateTime.Now
、TimeZoneInfo.Local
、ToLocalTime
和ToUniversalTime
(假定输入为本地时间)。最好在业务逻辑或应用程序配置中提供适用的时区。