2015-12-15 23 views
0

我有以下格式的字符串:是否有更優雅的方式將此時間轉換爲我的服務器當地時間?

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() 

我已經玩過這個遊戲了,但總是要休息幾個小時,上面是我發現的工作,但只是想知道是否有更好的方法。另外請注意,它可以部署在多個服務器上,所以我不想指定時區來將其明確轉換爲本地時間的原因。

回答

1

有幾件事情:

  • 如果你要包括在格式字符串中固定的文本,把它放在單引號剔因此它不能得到誤解爲一個格式令牌。 ('PST'

  • 在一般情況下,時區縮寫只能用於顯示目的。他們不應該被解析爲輸入,因爲他們可能不明確。例如,CST有5種不同的解釋。它可能是美國中部標準時間,但它也可能是中國標準時間,或其中一個。 See the list on Wikipedia

  • 如果您希望支持的時區縮寫數量有限,則可以從字符串中提取它,並使用字典,選擇/案例語句或條件邏輯來映射它們。只要確定你知道你想要支持的整套縮寫,以及你想要它們映射到哪些時區。另外請務必考慮日光時間的縮寫,如PDT

  • 請注意,一些較老的標準(例如RFC 2822 §4.3)確實硬編碼了一些縮寫,因此如果您正在解析該特定格式,則可以選擇支持這些縮寫。 (您的是類似的,但不完全匹配。)

  • 您的代碼基本沒問題,但您應該檢查TryParseExact的結果。否則,你可能會使用ParseExact,它會在失敗時拋出異常,而不是僅僅返回false。

  • 如果您想一步完成轉換,則可以使用ConvertTimeTimeZoneInfo.Local作爲目標區域。代碼會稍微小一些,但不會有技術上的差異。

  • 你確定你確實想這麼做嗎?依靠系統的本地時區通常不應該在基於服務器的應用程序中完成。這對桌面和移動更適合。一般來說,服務器端代碼不應該依賴系統時區來做任何事情。避免使用「本地時間」API,包括DateTime.Now,TimeZoneInfo.Local,ToLocalTimeToUniversalTime(假設輸入是本地時間)。最好在業務邏輯或應用程序配置中提供適用的時區。

+0

優秀的答案。謝謝。所有的觀點都是完全合理的,我被困在特定的格式和TZ中的唯一原因是這是paypal IPN相關的,它使用PDT和PST – user1447679

+0

然後考慮用'-08:00'替換'PST','' PDT'與'-07:00',然後使用'DateTimeOffset.ParseExact'和'zzz'格式說明符。然後,您將擁有一個有效的「DateTimeOffset」,您可以將其轉換爲任何時區,或者只需使用LocalDateTime屬性即可。 –

相關問題