时区当前时间
问题描述:
我有不同的时区和他们的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”中的当前时间。
答
TimeZoneInfo.ConvertTimeFromUtc(mytime, TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"));
答
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+)。
答
您提供的时区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);
重复:http://*.com/questions/246498/creating-a-datetime-in-a-specific-time-zone-in-c- fx-3-5 – 2010-07-14 13:51:43
相关问题 - http://*.com/questions/2532729/daylight-saving-time-and-timezone-best-practices – Oded 2010-07-23 20:26:10