Rrule: يجب استخدام DTSTART كأول ظهور

تم إنشاؤها على ٢٥ يناير ٢٠١٥  ·  10تعليقات  ·  مصدر: jakubroztocil/rrule

وفقًا لمواصفات iCalendar:

 The "DTSTART" property defines the first instance in the recurrence set.

ويتضمن مثالا على ذلك:

 Every other week on Monday, Wednesday and Friday until December 24,
 1997, but starting on Tuesday, September 2, 1997:

 DTSTART;TZID=US-Eastern:19970902T090000
 RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;
  BYDAY=MO,WE,FR
 ==> (1997 9:00 AM EDT)September 2,3,5,15,17,19,29;October
 1,3,13,15,17
     (1997 9:00 AM EST)October 27,29,31;November 10,12,14,24,26,28;
                       December 8,10,12,22

لا يتضمن rrule.js الثاني من سبتمبر كحدث. في rrule.js أول ظهور هو الثالث من سبتمبر.

التعليق الأكثر فائدة

أوافق ، بشكل افتراضي ، يجب أن يكون dtstart شاملاً ليكون أكثر اتساقًا مع الأنظمة الأخرى.

لقد صنعت رمزًا يوضح التفاصيل الدقيقة للسلوك الحالي: https://codepen.io/arshaw/pen/qwEQNO؟

ال 10 كومينتر

بالإضافة إلى 1 على هذا. لا تحترم RRule تاريخ / مدة البدء على التطبيق التجريبي على الإطلاق

تم الاتفاق على أن هذا أوقفني عند التعامل مع Google RFC 2445 java lib.

: +1: هذه هي الطريقة التي يعمل بها التقويم القياسي (والأنظمة المتوافقة مثل تقويم Google وتقويم Apple (Mac OS / iOS / iCloud).

jkbrzt ، الآن ، rrule.js مرتبط بوظائف python dateutil

على عكس ما تم توثيقه في RFC ، فإن تاريخ البدء (dtstart) ليس مثيل التكرار الأول ، ما لم يكن مناسبًا للقواعد المحددة.
- – داتوتيل المستندات

قد يبدو هذا خروجًا كبيرًا عن التاريخ ، والذي يبدو منطقيًا في هذه الحالة. سيشمل تغيير جميع حالات الاختبار تقريبًا. أفكار؟ هل ستدعم التغيير؟

hwangmoretime لقد دمجت تغييراتك في توثيق README حيث يختلف rrule.js عن RFC ، شكرًا على ذلك. نعم ، سيكون من المنطقي جعل rrule.js متوافقًا (هذه المشكلة + وسيطة الكلمة الرئيسية byday ). سوف يكسر التوافق مع الإصدارات السابقة على الرغم من أنه يحتاج إلى توثيق جيد.

أعتقد أن هذا لا يزال به خطأ. هذا يعمل مقابل all() لكن ليس مع الطريقة between . في المثال أدناه ، قمت بتعيين dtstart و rdate على كائن RRuleSet ، وفقًا للملف التمهيدي.

screen shot 2016-03-19 at 1 41 49 pm

القاعدة
RRuleSet {_cache: Object, _rrule: Array[1], _rdate: Array[1], _exrule: Array[0], _exdate: Array[0]}

rruleSet.valueOf ()
["RRULE:FREQ=YEARLY;DTSTART=20120122T000000Z;INTERVAL=1;WKST=0;BYMONTH=3;BYMONTHDAY=19;BYHOUR=13;BYMINUTE=39;BYSECOND=27", "RDATE:20120122T000000Z"]

rruleSet.all () [0]
Sat Jan 21 2012 16:00:00 GMT-0800 (PST)

rruleSet.bet بين (وقت البدء ، تاريخ الانتهاء ، تاريخ الانتهاء)
[Sat Mar 19 2016 13:39:27 GMT-0700 (PDT)]

لاحظ أنه بالنسبة لاستدعاء الطريقة all ، فإن التاريخ الذي تم إرجاعه يطابق السعر الأصلي dtstart ولكن بالنسبة لـ between ، يعود التاريخ الافتراضي إلى الوقت الحالي

إليك سياق أكثر قليلاً. بقدر ما أستطيع أن أقول ، فإن القاعدة تفعل بالضبط عكس ما كنت أتوقعه. ينتج قائمة بالتواريخ ، حيث يكون العنصر الصفري هو بداية الحدث الأصلي المطلوب. ولكن هذا هو الوقت الحالي الذي يتم فيه توسيع نطاقه إلى سلسلة من التواريخ. كنت أتوقع أن أحصل على قائمة بالتواريخ في 21 كانون الثاني (يناير) ، لكن القاعدة "تكررت" باستخدام الوقت الحالي (22 آذار (مارس)).

screen shot 2016-03-22 at 6 02 21 pm

لقد سحبت الريبو وأحاول تضييق هذا الأمر ببعض الاختبارات ولكن أي نصيحة موضع تقدير.

لدي مشكلة مماثلة مع dtstart. راجع https://stackoverflow.com/questions/54517101/rrule-not-setting-correct-time-if-dtstart-is-set
عندما أقوم بتعيين dtstart في المُنشئ ، أحصل على الأوقات الصحيحة مع .all () ولكن إذا قمت بتعيين dtstart بعد ذلك ، فسأحصل على الوقت الحالي.

أوافق ، بشكل افتراضي ، يجب أن يكون dtstart شاملاً ليكون أكثر اتساقًا مع الأنظمة الأخرى.

لقد صنعت رمزًا يوضح التفاصيل الدقيقة للسلوك الحالي: https://codepen.io/arshaw/pen/qwEQNO؟

بشكل افتراضي ، يجب أن يكون dtstart شاملاً ليكون أكثر اتساقًا مع الأنظمة الأخرى.

متفق. الحصول على السرعة على القاعدة الآن. إنه موفر للوقت رائع (شكرًا لك!) ، لكن هذا التاريخ الشامل يسبب فارقًا بسيطًا غريبًا يتطلب بعض المنطق المخصص لمعالجته. أتمنى أن أرى هذا محدثًا. فهمت أن السلوك الحالي يتوافق مع python-dateutil ، لكنني أعتقد أن الأولوية يجب أن تكون على السلوك المتوافق مع معيار RFC ، بدلاً من إدامة الانحراف الفردي.

أيضًا ، لكل تعليق أدناه:

لاحظ أنه يمكنك الحصول على السلوك الأصلي باستخدام مجموعة RRuleSet وإضافة dtstart كتاريخ.

أفضل ما يمكنني قوله ، هذا يقلل بشكل كبير من تعقيد الحل اللازم للعديد من حالات الاستخدام.

على سبيل المثال ، افترض أن لديك معلمات القاعدة التالية:

new RRule({
  freq: RRule.WEEKLY,
  dtstart: new Date(Date.UTC(2020, 10, 1, 21, 0, 0)),
  count: 10,
  interval: 2,
  byweekday: RRule.MO
})

يجب أن يُترجم هذا إلى "كل أسبوعين يوم الاثنين لمدة 10 مرات" ، مع تاريخ بدء يوم الأحد ، 1 تشرين الثاني (نوفمبر) 2020.

الآن ، أول تقويم يوم الاثنين بعد تاريخ البدء هو الثاني من نوفمبر ... لذلك ، مع وجود فاصل زمني 2 ، نتوقع أن تكون تواريخ الأحداث التي تم إنشاؤها في 2 نوفمبر ، 16 نوفمبر ، 30 نوفمبر ، إلخ.

ومع ذلك ، فإن الحزمة rrule تمنحنا بدلاً من ذلك تواريخ 9 نوفمبر ، 23 نوفمبر ، وما إلى ذلك. بمعنى آخر ، فاصلنا الزمني بالكامل خاطئ ، وقد تم نقله إلى الأمام لمدة أسبوع واحد. إصلاح هذا ليس بسيطًا مثل "استخدام مجموعة RRuleSet وإضافة dtstart كتاريخ." هناك الكثير من العمل على هذا النوع من الإصلاح.

image

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

maconfr picture maconfr  ·  6تعليقات

berardo picture berardo  ·  9تعليقات

grigio picture grigio  ·  7تعليقات

jimmywarting picture jimmywarting  ·  9تعليقات

agordeev picture agordeev  ·  16تعليقات