2016-10-12 46 views
6

如果我只有一個表示時區的字符串,那麼獲取分鐘的最簡單方法是什麼? (例如,「歐洲/倫敦」)使用NodaTime從時區(字符串)獲取抵消分鐘

到目前爲止,我有:

public static int ConvertFromTimeZoneToMinutesOffset(string timeZone) 
{ 
    DateTimeZone zone = DateTimeZoneProviders.Tzdb[timeZone]; 

    // Need magic code to get offset as minutes 
} 

但我沒有找到一個簡單的方法將其轉換爲分鐘。

注意:我需要的是在該代碼正在執行的特定時刻的偏移量。在該時區和UTC之間。

+3

什麼抵消?它隨時間而變化。現在是60分鐘,但在10月30日它會回到0 ... –

+0

@JonSkeet對不起,我的意思是在執行代碼的特定時刻的偏移量。在該時區和UTC之間。 –

+0

對 - 請更新問題以表明這一點。 –

回答

14

您需要DateTimeZone.GetUtcOffset(Instant)

public static int ConvertFromTimeZoneToMinutesOffset(string timeZone, IClock clock) 
{ 
    DateTimeZone zone = DateTimeZoneProviders.Tzdb[timeZone]; 
    Offset offset = zone.GetUtcOffset(clock.Now); 
    return offset.Milliseconds/NodaConstant.MillisecondsPerMinute; 
} 

可以離開關IClock參數,而不是在方法使用SystemClock.Instance,但會導致代碼更難測試。

+0

非常感謝Skeet先生。 –

+2

@AxelPrieto:我剛剛編輯它,否則你最終不得不把結果投給'int'。 –

-2

分鐘使用DatePart()函數。

+0

這還不夠。我沒有「DateTime」,我有一個TimeZone。我需要的分鐘,所以而不是「美國/布宜諾斯艾利斯」我需要-90(以分鐘爲單位的偏移量) –

+3

我沒有看到'DatePart'完全回答這個問題... –