我有一个以下格式的字符串:
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()
我已经玩过这个,但总是在几个小时之内关闭,上面是我发现的工作,但只是想知道是否有更好的方法。另请注意,它可以部署在多个服务器上,因此我不想指定时区将其明确转换为本地时间的原因。
答案 0 :(得分:1)
一些事情:
如果您要在格式字符串中包含固定文本,请将其放在单标记引号中,这样就不会将其误解为格式化标记。 ('PST'
)
在一般情况下,时区缩写仅应用于显示目的。它们不应该被解析为输入,因为它们可能是模糊的。例如,CST
有5种不同的解释。它可能是美国中央标准时间,但它也可能是中国标准时间,或其他一个。 See the list on Wikipedia
如果您希望支持有限数量的时区缩写,则可以从字符串中提取它并使用字典,select / case语句或条件逻辑来映射它们。请确保您知道要支持的整个缩写集以及您希望它们映射到的时区。另外,请务必考虑日光时间缩写,例如PDT
。
请注意,某些较旧的标准(例如RFC 2822 §4.3)确实会对一些缩写进行硬编码,因此如果您要解析该特定格式,则可以选择支持这些缩写。 (你的相似,但不太匹配。)
您的代码基本上没问题,但您应该查看TryParseExact
的结果。否则你也可以使用ParseExact
,它会在失败时抛出异常而不是仅返回false。
如果您想在一个步骤中完成转化,则可以将ConvertTime
与TimeZoneInfo.Local
一起用作目标区域。代码会略小,但没有技术差异。
您确定要真的这么做吗?通常不应该在基于服务器的应用程序中完成依赖系统的本地时区。这更适合桌面和移动设备。通常,服务器端代码不应该依赖于系统时区。避免使用“本地时间”API,包括DateTime.Now
,TimeZoneInfo.Local
,ToLocalTime
和ToUniversalTime
(假设输入是本地时间)。最好在业务逻辑或应用程序配置中提供适用的时区。