簡體   English   中英

在C#中獲取服務器的時區偏移量

[英]Get Timezone Offset of Server in C#

如何獲取運行我的代碼的物理服務器的時區偏移量? 內存中沒有日期對象或其他對象。

例如,以下代碼將輸出-4:00:00

<%= TimeZone.CurrentTimeZone.GetUtcOffset(new DateTime()) %>

因為夏令時應該是-03:00:00

new DateTime()將為您提供1月1日0001,而不是當前日期/時間。 我懷疑你想要當前的 UTC偏移...這就是你沒有在當前代碼中看到夏令時偏移的原因。

我使用TimeZoneInfo.Local而不是TimeZone.CurrentTimeZone - 它可能不會影響事物,但它絕對是一個更好的方法。 TimeZoneInfo應該在所有代碼中取代TimeZone 然后你可以使用GetUtcOffset

var offset = TimeZoneInfo.Local.GetUtcOffset(DateTime.UtcNow);

(使用DateTime.Now 應該也能正常工作,但是當現在有夏令時轉換時,它會涉及幕后的一些魔法DateTime 實際上有四種而不是廣告中的三種 ,但更簡單的方法就是通過使用UtcNow完全避免這個問題。)

或者當然你可以使用我的Noda Time庫而不是所有這些BCL垃圾;)(如果你做了很多日期/時間的工作,我會徹底推薦 - 顯然 - 但如果你只是做這一點,這可能是矯枉過正的。)

從.NET 3.5開始,您可以使用DateTimeOffset的以下內容來獲取當前偏移量。

var offset = DateTimeOffset.Now.Offset;

MSDN文檔

GetUtcOffset如何與new DateTime()DateTime.Now一起使用似乎有些不同。 當我在中央時區運行時,我得到:

TimeZone.CurrentTimeZone.GetUtcOffset(new DateTime()) // -06:00:00

TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now)   // -05:00:00

這有點像kludge,但我想你也可以這樣做:

DateTime.Now - DateTime.UtcNow // -05:00:00

當你收縮一個新的DateTime對象時,它獲得DateTime.MinValue當你得到它的TimeZone.CurrentTimeZone.GetUtcOffset你實際得到該日期的時間偏移量。 如果您使用DateTime.Now您將獲得當前日期和時間以及當前偏移量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM