我有以下代码,其中应该返回60的偏移量(显示目前在英国,我们在英国夏令时 - 即比格林威治标准时间早60分钟):< / p>
var info = TimeZoneInfo.FindSystemTimeZoneById("Greenwich Standard Time");
DateTimeOffset localServerTime = DateTimeOffset.Now;
double off = localServerTime.Offset.TotalMinutes;
return off;
然而,它返回0.
有人可以帮我解决这个问题吗?
答案 0 :(得分:8)
使用TimeZoneInfo.IsDaylightSavingTime Method (DateTimeOffset)查找当前是否为您的时区保存夏令时。
var info = TimeZoneInfo.FindSystemTimeZoneById("Greenwich Standard Time");
DateTimeOffset localServerTime = DateTimeOffset.Now;
bool isDaylightSaving = info.IsDaylightSavingTime(localServerTime);
还有其他例子here
答案 1 :(得分:0)
如果您获得0并且居住在英国,则您的计算机配置不正确。可能的原因是:
小心做出彻底的改变,如果配置错误,可能会故意在服务器上运行的关键业务应用程序中解决某些缺陷。与任何管理服务器的人交谈。
答案 2 :(得分:0)
要掌握从一个时区到另一个时区的转换,您需要查看支持的内容(如何?)以及不支持的内容。
foreach (var tz in TimeZoneInfo.GetSystemTimeZones())
{
Console.WriteLine("TimeZone Offset: {0} Name : {1}, Supports DLS: {2}", tz.BaseUtcOffset,tz.StandardName,tz.SupportsDaylightSavingTime);
}
这应该为您提供所有时区的列表,包括有关DayLightSaving的信息。 请注意:
TimeZone Offset:00:00:00名称:格林威治标准时间,支持DLS:错误
TimeZone Offset:00:00:00名称:GMT标准时间,支持DLS:True
因此,您需要使用“GMT标准时间”,因为它已经支持夏令时。不需要做任何工作。
以下是示例代码:
private static string GetBSTTimeStamp(string timestamp)
{
DateTime dt = DateTime.Parse(timestamp);
//TimeZoneInfo bst = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
//Console.WriteLine("Time zone supports dls? {0}", bst.SupportsDaylightSavingTime);
//Console.WriteLine("Time zone offset? {0}", bst.BaseUtcOffset);
DateTime dateTimeInUtc = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dt, "Eastern Standard Time", "GMT Standard Time");
return dateTimeInUtc.ToString();
}
答案 3 :(得分:0)
另一种选择是使用Noda Time。
以下代码适用于Noda Time 1.4及更高版本:
var zone = NodaTime.TimeZones.TzdbDateTimeZoneSource.Default.ForId("Europe/London");
var zonedClock = NodaTime.SystemClock.Instance.InZone(zone);
var zonedDateTime = zonedClock.GetCurrentZonedDateTime();
bool isDST = zonedDateTime.IsDaylightSavingTime();
Console.WriteLine(isDST);
zone
是代表英国时区的DateTimeZone
对象,“欧洲/伦敦”zonedClock
是一个ZonedClock
对象,在本例中代表系统时钟和英国的时区zonedDateTime
是一个ZonedDateTime
对象,表示时区中的当前日期和时间(“基础时钟提供的当前时刻,调整为此对象的时区”)isDST
是一个布尔值,表示当前时刻是否在DST中。在撰写本文时(2018年4月),评估结果为true
对于早期版本的Noda ZonedClock
不可用,我们可以这样做:
var zone = NodaTime.TimeZones.TzdbDateTimeZoneSource.Default.ForId("Europe/London");
var now = Instant.FromDateTimeOffset(DateTimeOffset.Now);
var zonedDateTime = new ZonedDateTime(now, zone);
bool isDST = zonedDateTime.IsDaylightSavingTime();