无法在datetime对象上检查DST [英] Unable to check DST on datetime object
问题描述
我正在尝试检查DST中的DateTime变量中的值。我们不是从系统中选择时区,而是从数据库中选择它并在检查DST的日期时使用。
DateTime date = new DateTime(2017,11 ,3,20,0,0);
for(int i = 0; i< 70; i ++)
{
TimeZoneInfo zone = TimeZoneInfo.CreateCustomTimeZone(" America / Los_Angeles",new TimeSpan(-8) ,0,0),"America / Los_Angeles","America / Los_Angeles");
bool res = zone.IsAmbiguousTime(date);
if(res == false)
{
bool DST = zone.IsDaylightSavingTime(date);
Console.WriteLine(date .ToShortDateString()+"" + date.ToLongTimeString()+":" + DST.ToString());
if(DST)
{
//某些逻辑
}
}
date = date.AddHours(1);
}
以上代码始终将DST返回为假,其中PST时区DST更改发生在2017年4月4日晚上凌晨2点。
11/3/2017 8:00:00 PM:False
11/3 / 2017 9:00:00 PM:False
11/3/2017 10:00:00 PM:False
11/3/2017 11:00:00 PM :False
11/4/2017 12:00:00 AM:False
11/4/2017 1:00:00 AM:False
11/4/2017 2:00:00 AM:False
11/4/2017 3:00:00 AM:False
11/4/2017 4 :00:00 AM:False
11/4/2017 5:00:00 AM:False
11/4/2017 6:00:00 AM:False
11/4/2017 7:00:00 AM:False
11/4/2017 8:00:00 AM:False
11 / 4/2017 2017 9:00:00 AM:False
11/4/2017 10:00:00 AM:False
11/4/2017 11:00: 00 AM:False
11/4/2017 12:00:00 PM:False
11/4/2017 1:00:00 PM:False
11/4/2017 2:00:00 PM:False
11/4/2017 3:00:00 PM:False
11/4 / 2017年4:00:00 PM:Fal se
11/4/2017 5:00:00 PM:False
11/4/2017 6:00:00 PM:False
11/4/2017 7:00:00 PM:False
11/4/2017 8:00:00 PM:False
11/4/2017 9: 00:00 PM:False
11/4/2017 10:00:00 PM:False
11/4/2017 11:00:00 PM:False
11/5/2017 12:00:00 AM:False
11/5/2017 1:00:00 AM:False
11 / 5/2017 2:00:00 AM:False
11/5/2017 3:00:00 AM:False
11/5/2017 4:00:00 AM:False
11/5/2017 5:00:00 AM:False
11/5/2017 6:00:00 AM:False
11/5/2017 7:00:00 AM:False
11/5/2017 8:00:00 AM:False
11/5/2017 9:00:00 AM:False
11/5/2017 10:00:00 AM:False
11/5/2017 11:00:00 AM:False
11/5/2017 12:00:00 PM:False
11/5/2017 1:00:00 PM:False
11/5/2017 2:00:00 PM:False
11/5/2017 3:00:00 PM:False
11/5/2017 4:00 :00 PM:False
11/5/2017 5:00:00 PM:False
11/5/2 017 6:00:00 PM:False
11/5/2017 7:00:00 PM:False
11/5/2017 8:00:00 PM:错误$
11/5/2017 9:00:00 PM:错误¥
11/5/2017 10:00:00 PM:假_
11/5/2017 11:00:00 PM:False
11/6/2017 12:00:00 AM:False
11/6/2017 1: 00:00 AM:False
11/6/2017 2:00:00 AM:False
11/6/2017 3:00:00 AM:False
11/6/2017 4:00:00 AM:False
11/6/2017 5:00:00 AM:False
11 / 6/2017 6:00:00 AM:False
11/6/2017 7:00:00 AM:False
11/6/2017 8:00:00上午:错误¥
11/6/2017 9:00:00 AM:错误¥
11/6/2017 10:00:00 AM:False
11/6/2017 11:00:00 AM:False
11/6/2017 12:00:00 PM:False
11/6/2017下午1:00:假:
11/6/2017 2:00:00 PM:错误¥
11/6/2017 3:00:00 PM:False
11/6/2017 4:00:00 PM:False
11/6/2017 5:00:00 PM:False
我的代码中哪些不正确?
由于
zone.SupportsDaylightSavingTime false ,因此此自定义时区不支持夏令时(DST)。
查看文档中的示例并尝试此时区:
TimeSpan delta = new TimeSpan(1,0,0);
var transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1,1,1,2,0,0),3,4);
var transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1,1,1,2,0,0),11,4);
var adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(DateTime.MinValue.Date,DateTime.MaxValue.Date,
delta,transitionRuleStart,transitionRuleEnd);
TimeZoneInfo zone = TimeZoneInfo.CreateCustomTimeZone(" America / Los_Angeles",new TimeSpan(-8,0,0)," America / Los_Angeles","America / Los_Angeles"," America / Los_Angeles(DST)",new [] {adjustment});
根据您的需要进行调整并进一步研究。
I am trying to check DST for a value in my DateTime variable. Instead of picking the timeszone from the system, we pick it from database and use while checking the date for DST.
DateTime date = new DateTime(2017, 11, 3, 20, 0, 0); for (int i = 0; i < 70; i++) { TimeZoneInfo zone = TimeZoneInfo.CreateCustomTimeZone("America/Los_Angeles", new TimeSpan(-8, 0, 0), "America/Los_Angeles", "America/Los_Angeles"); bool res = zone.IsAmbiguousTime(date); if (res == false) { bool DST = zone.IsDaylightSavingTime(date); Console.WriteLine (date .ToShortDateString()+ " "+date.ToLongTimeString() + " : " + DST.ToString()); if (DST) { // Some logic } } date = date.AddHours(1); }
Above code always returns DST as false where as in PST timezone DST change occurred on 4-5 th nov 2017 night at 2 AM.
11/3/2017 8:00:00 PM : False
11/3/2017 9:00:00 PM : False
11/3/2017 10:00:00 PM : False
11/3/2017 11:00:00 PM : False
11/4/2017 12:00:00 AM : False
11/4/2017 1:00:00 AM : False
11/4/2017 2:00:00 AM : False
11/4/2017 3:00:00 AM : False
11/4/2017 4:00:00 AM : False
11/4/2017 5:00:00 AM : False
11/4/2017 6:00:00 AM : False
11/4/2017 7:00:00 AM : False
11/4/2017 8:00:00 AM : False
11/4/2017 9:00:00 AM : False
11/4/2017 10:00:00 AM : False
11/4/2017 11:00:00 AM : False
11/4/2017 12:00:00 PM : False
11/4/2017 1:00:00 PM : False
11/4/2017 2:00:00 PM : False
11/4/2017 3:00:00 PM : False
11/4/2017 4:00:00 PM : False
11/4/2017 5:00:00 PM : False
11/4/2017 6:00:00 PM : False
11/4/2017 7:00:00 PM : False
11/4/2017 8:00:00 PM : False
11/4/2017 9:00:00 PM : False
11/4/2017 10:00:00 PM : False
11/4/2017 11:00:00 PM : False
11/5/2017 12:00:00 AM : False
11/5/2017 1:00:00 AM : False
11/5/2017 2:00:00 AM : False
11/5/2017 3:00:00 AM : False
11/5/2017 4:00:00 AM : False
11/5/2017 5:00:00 AM : False
11/5/2017 6:00:00 AM : False
11/5/2017 7:00:00 AM : False
11/5/2017 8:00:00 AM : False
11/5/2017 9:00:00 AM : False
11/5/2017 10:00:00 AM : False
11/5/2017 11:00:00 AM : False
11/5/2017 12:00:00 PM : False
11/5/2017 1:00:00 PM : False
11/5/2017 2:00:00 PM : False
11/5/2017 3:00:00 PM : False
11/5/2017 4:00:00 PM : False
11/5/2017 5:00:00 PM : False
11/5/2017 6:00:00 PM : False
11/5/2017 7:00:00 PM : False
11/5/2017 8:00:00 PM : False
11/5/2017 9:00:00 PM : False
11/5/2017 10:00:00 PM : False
11/5/2017 11:00:00 PM : False
11/6/2017 12:00:00 AM : False
11/6/2017 1:00:00 AM : False
11/6/2017 2:00:00 AM : False
11/6/2017 3:00:00 AM : False
11/6/2017 4:00:00 AM : False
11/6/2017 5:00:00 AM : False
11/6/2017 6:00:00 AM : False
11/6/2017 7:00:00 AM : False
11/6/2017 8:00:00 AM : False
11/6/2017 9:00:00 AM : False
11/6/2017 10:00:00 AM : False
11/6/2017 11:00:00 AM : False
11/6/2017 12:00:00 PM : False
11/6/2017 1:00:00 PM : False
11/6/2017 2:00:00 PM : False
11/6/2017 3:00:00 PM : False
11/6/2017 4:00:00 PM : False
11/6/2017 5:00:00 PM : False
What is not right in my code?
Since zone.SupportsDaylightSavingTime is false, then this custom time zone does not support Daylight Saving Time (DST).
Check the examples in the Documentation and try this time zone:
TimeSpan delta = new TimeSpan( 1, 0, 0 ); var transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule( new DateTime( 1, 1, 1, 2, 0, 0 ), 3, 4 ); var transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFixedDateRule( new DateTime( 1, 1, 1, 2, 0, 0 ), 11, 4 ); var adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule( DateTime.MinValue.Date, DateTime.MaxValue.Date, delta, transitionRuleStart, transitionRuleEnd ); TimeZoneInfo zone = TimeZoneInfo.CreateCustomTimeZone( "America/Los_Angeles", new TimeSpan( -8, 0, 0 ), "America/Los_Angeles", "America/Los_Angeles", "America/Los_Angeles (DST)", new[] { adjustment } );
Adjust it according to your needs and further researches.
这篇关于无法在datetime对象上检查DST的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!