有没有更优雅的方法将这个时间转换为我服务器的本地时间?
Is there a more elegant way to convert this time to my server's local time?
我有以下格式的字符串:
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种不同的解释。它可能是美国中部标准时间,但也可能是中国标准时间或其他时间之一。 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
(当它假定输入是本地时间时)。最好在您的业务逻辑或应用程序配置中提供适用的时区。
我有以下格式的字符串:
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种不同的解释。它可能是美国中部标准时间,但也可能是中国标准时间或其他时间之一。 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
(当它假定输入是本地时间时)。最好在您的业务逻辑或应用程序配置中提供适用的时区。