首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DDay图书馆是否正确计算循环规则?

DDay图书馆是否正确计算循环规则?
EN

Stack Overflow用户
提问于 2016-06-25 06:27:46
回答 3查看 1.5K关注 0票数 6

我做了一些测试。这是我的代码:

代码语言:javascript
复制
var systemTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
var icalTimeZone = iCalTimeZone.FromSystemTimeZone(systemTimeZone);

var startTimeSearch = new DateTime(2015, 9, 8, 0, 0, 0, DateTimeKind.Utc);
var endTimeSearch = new DateTime(2015, 12, 1, 00, 0, 0, DateTimeKind.Utc);

var iCalendar = new iCalendar();
var pacificTimeZone = _iCalendar.AddTimeZone(icalTimeZone);

var event = new Event
{
    Summary = "This is an event at 2015-09-08 10:30 PST (2015-09-08 17:30 UTC)",
    DTStart = new iCalDateTime(2015, 9, 8, 10, 30, 0, pacificTimeZone.TZID, iCalendar),
    Duration = new TimeSpan(0, 1, 0, 0)
};

var rp = new RecurrencePattern("FREQ=WEEKLY;UNTIL=20151112T080000Z;WKST=SU;BYDAY=TU");

event.RecurrenceRules.Add(rp);
iCalendar.Events.Add(_event);
var occurrences = iCalendar.GetOccurrences(startTimeSearch, endTimeSearch);

结果如下:

10发生-以下是发生的Period.StartTime.Value和UTC特性

- 9/8/2015 10:30- UTC 9/8/2015 17:30:00

- 9/15/2015 10:30- UTC 9/15/2015 17:30:00

- 9/22/2015 10:30- UTC 9/22/2015 17:30:00

- 9/29/2015 10:30- UTC 9/29/2015 17:30:00

- 10/6/2015 10:30- UTC 10/6/2015 17:30:00

- 10/13/2015 10:30- UTC 10/13/2015 17:30:00

- 10/20/2015 10:30- UTC 10/20/2015 17:30:00

- 10/27/2015 10:30- UTC 10/27/2015 17:30:00

-11/3/2015 10:30- UTC 11/3/2015 17:30(这应该是18:30:00!)

- 11/10/2015 10:30- UTC 11/10/2015 17:30(这应该是18:30:00!)

正如你所看到的,最后两个世界协调时间应该是18:30:00。所以我想知道这是DDay的工作方式,我不应该指望它能使UTC的日期时间正确,或者我是否做错了什么。

EN

回答 3

Stack Overflow用户

发布于 2016-06-27 09:55:59

由于日光节约,你得到了这个时差。一种可能的解决方案是不按名称Pacific Standard Time获取时区。

代码语言:javascript
复制
 // First load a file containing time zone information for Pacific Standard Time
var systemTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");

代替此使用系统时区,如

代码语言:javascript
复制
var systemTimeZone = TimeZoneInfo.GetSystemTimeZones().FirstOrDefault();

或者简单地添加本地时区:

代码语言:javascript
复制
iCalendar iCalendar= new iCalendar();
iCalendar.AddLocalTimeZone();

若要查找所有已注册时区,单击此处

代码语言:javascript
复制
ReadOnlyCollection<TimeZoneInfo> zones = TimeZoneInfo.GetSystemTimeZones();
Console.WriteLine("The local system has the following {0} time zones", zones.Count);
foreach (TimeZoneInfo zone in zones)
   Console.WriteLine(zone.Id);

我只是在代码中使用GetSystemTimeZones(),如下所示

代码语言:javascript
复制
public static void Test1()
    {
        var systemTimeZone = TimeZoneInfo.GetSystemTimeZones().FirstOrDefault();
        //TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
        var icalTimeZone = iCalTimeZone.FromSystemTimeZone(systemTimeZone);

        var startTimeSearch = new DateTime(2015, 9, 8, 0, 0, 0, DateTimeKind.Utc);
        var endTimeSearch = new DateTime(2015, 12, 1, 00, 0, 0, DateTimeKind.Utc);

        var iCalendar = new iCalendar();
        var pacificTimeZone = iCalendar.AddTimeZone(icalTimeZone);

        var _event =
        new Event
        {
            Summary = "This is an event at 2015-09-08 10:30 PST (2015-09-08 17:30 UTC)",
            DTStart = new iCalDateTime(2015, 9, 8, 10, 30, 0, pacificTimeZone.TZID, iCalendar),
            Duration = new TimeSpan(0, 1, 0, 0)
        };

        var rp = new RecurrencePattern("FREQ=WEEKLY;UNTIL=20151112T080000Z;WKST=SU;BYDAY=TU");

        _event.RecurrenceRules.Add(rp);
        iCalendar.Events.Add(_event);

        var occurrences = iCalendar.GetOccurrences(startTimeSearch, endTimeSearch);
    }

当我调试时,它得到了输出,就像

您可以相应地更改时区并得到结果。希望它能帮到你。

票数 8
EN

Stack Overflow用户

发布于 2016-08-27 18:53:59

不要使用dday.ical;使用ical.net

这应该会让你开始:

代码语言:javascript
复制
var iCalendar = new Calendar();

var start = new DateTime(2015, 9, 8, 10, 30, 0);
var e = new Event
{
    Summary = "This is an event at 2015-09-08 10:30 PST (2015-09-08 17:30 UTC)",
    DtStart = new CalDateTime(start, "Pacific Standard Time"),
    Duration = TimeSpan.FromHours(1)
};

var rp = new RecurrencePattern("FREQ=WEEKLY;UNTIL=20151112T080000Z;WKST=SU;BYDAY=TU");
e.RecurrenceRules.Add(rp);
iCalendar.Events.Add(e);

var startTimeSearch = new DateTime(2015, 9, 8, 0, 0, 0, DateTimeKind.Utc);
var endTimeSearch = new DateTime(2015, 12, 1, 00, 0, 0, DateTimeKind.Utc);
var occurrences = iCalendar.GetOccurrences(startTimeSearch, endTimeSearch);

结果:

票数 2
EN

Stack Overflow用户

发布于 2018-04-20 22:31:50

我可以解决这个问题。原来您不应该在ExceptionDates中指定时间,只需添加日期组件,

这似乎是可行的,GetOccurances现在正确地识别异常日期。希望这能帮助那些经历同样痛苦的人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38025682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档