2010-07-14 100 views
2

我有不同的時區和他們的GMT和DST。示例:時區當前時間

TimeZoneId  | GMT offset | DST offset 
        | 1. Jan 2010 | 1. Jul 2010 
-------------------------------------------------- 
America/Adak  | -10.0  |  -9.0 
America/Anchorage |  -9.0  |  -8.0 
America/Anguilla |  -4.0  |  -4.0 
America/Antigua |  -4.0  |  -4.0 
America/Araguaina |  -3.0  |  -3.0 

此時區由Geoname提供。

如何計算在C#/ .NET中已知GMT和DST的任何時區的當前時間?

更新:爲了更好地說明,我提供了「America/Antigua」,我需要「America/Antigua」中的當前時間。

+0

重複:http://stackoverflow.com/questions/246498/creating-a-datetime-in-a-specific-time-zone-in-c- fx-3-5 – 2010-07-14 13:51:43

+0

相關問題 - http://stackoverflow.com/questions/2532729/daylight-saving-time-and-timezone-best-practices – Oded 2010-07-23 20:26:10

回答

2
TimeZoneInfo.ConvertTimeFromUtc(mytime, TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")); 
0
private static ReadOnlyCollection<TimeZoneInfo> _timeZones = TimeZoneInfo.GetSystemTimeZones(); 

public static DateTime ToUsersTime(this DateTime utcDate, int timeZoneId) 
{ 
    return TimeZoneInfo.ConvertTimeFromUtc(utcDate, timeZones[timeZoneId]); 
} 

使用TimeZoneInfo類UTC日期轉換到用戶的日期的一個例子(.NET 3.5+)。

2

您提供的時區ID是IANA時區數據庫中的時區ID,又名TZDB(又名Olson,又名tz)。它們不受.NET的支持(儘管在Linux/Mac上運行的.NET Core可能會做你想做的)。

Noda Time項目確實雖然支持他們。你會使用:

var zoneId = "America/Antigua"; 
var zone = DateTimeZoneProviders.Tzdb[zoneId]; 
var now = SystemClock.Instance.GetCurrentInstant(); 
var zoned = now.InZone(zone); 
Console.WriteLine(zoned); 

使用了SystemClock明確 - 在真正的代碼,我建議你通過依賴注入的可測試性,以接受IClock - 運行應用程序時注入SystemClock.Instance,但使用FakeClock進行測試。

替代等效代碼演示ZonedClock

var zoneId = "America/Antigua"; 
var zone = DateTimeZoneProviders.Tzdb[zoneId]; 
var systemClock = SystemClock.Instance; 
var zonedClock = systemClock.InZone(zone); 
var zoned = zonedClock.GetCurrentZonedDateTime(); 
Console.WriteLine(zoned);