无法在datetime对象上检查DST [英] Unable to check DST on datetime object

查看:61
本文介绍了无法在datetime对象上检查DST的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试检查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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆