2010-07-14 75 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);