Rrule: الأحداث المتكررة باستخدام التحول قبل الأسبوع بيوم واحد

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

  • [x] تحقق من أنك بحثت في المشكلات الحالية بحثًا عن التكرارات من قبل
    إنشاء واحدة جديدة
  • [x] نموذج التعليمات البرمجية إعادة إنتاج المشكلة. تأكد من تضمين جميع قيم الإدخال لك
    تستخدم مثل سلسلة RRule الدقيقة والتواريخ.
  • [x] الناتج المتوقع
  • [x] الإخراج الفعلي
  • [x] إصدار rrule الذي تستخدمه

    • 2.6.4

  • [x] نظام التشغيل الخاص بك

    • لينكس

  • [x] منطقتك الزمنية المحلية (قم بتشغيل $ date من سطر أوامر الجهاز الذي يعرض الخطأ)

    • أوروبا / باريس ولكن تم تغيير المناطق الزمنية. انظر أدناه


أحاول الحصول على أيام الثلاثاء القادمة بعد تاريخ معين (1 فبراير 2020 في أوروبا / باريس).
ومع ذلك ، فإن الأحداث تبدأ يوم الأربعاء إذا كانت لا تزال في تلك المنطقة الزمنية.
حساب الأحداث للمنطقة الزمنية America / New_York الأحداث كما هو متوقع.

يرجى التحقق من المقتطف أدناه. النتائج التي توصلت إليها هي:

// problem: events should be on Tuesday but are shifted by one day:
// Tue Feb 04 2020 00:00:00 GMT+0100 (Central European Standard Time) ...
$ TZ=Europe/Paris node zone.js Europe/Paris
rule:
DTSTART;TZID=Europe/Paris:20200131T230000
RRULE:FREQ=WEEKLY;BYDAY=TU;COUNT=2
events:
Wed Feb 05 2020 00:00:00 GMT+0100 (Central European Standard Time)
Wed Feb 12 2020 00:00:00 GMT+0100 (Central European Standard Time)
luxon:
Sat Feb 01 2020 00:00:00 GMT+0100 (Central European Standard Time)

// timezone America/New_York shows correct result
$ TZ=America/New_York node zone.js America/New_York
rule:
DTSTART;TZID=America/New_York:20200201T050000
RRULE:FREQ=WEEKLY;BYDAY=TU;COUNT=2
events:
Tue Feb 04 2020 00:00:00 GMT-0500 (Eastern Standard Time)
Tue Feb 11 2020 00:00:00 GMT-0500 (Eastern Standard Time)
luxon:
Sat Feb 01 2020 00:00:00 GMT-0500 (Eastern Standard Time)

// crossing timezones show correct result
$ TZ=America/New_York node zone.js Europe/Paris
rule:
DTSTART;TZID=Europe/Paris:20200201T050000
RRULE:FREQ=WEEKLY;BYDAY=TU;COUNT=2
events:
Mon Feb 03 2020 18:00:00 GMT-0500 (Eastern Standard Time)
Mon Feb 10 2020 18:00:00 GMT-0500 (Eastern Standard Time)
luxon:
Sat Feb 01 2020 00:00:00 GMT-0500 (Eastern Standard Time)

// UTC shows correct result
$ TZ=UTC node zone.js UTC
rule:
DTSTART:20200201T000000Z
RRULE:FREQ=WEEKLY;BYDAY=TU;COUNT=2
events:
Tue Feb 04 2020 00:00:00 GMT+0000 (Coordinated Universal Time)
Tue Feb 11 2020 00:00:00 GMT+0000 (Coordinated Universal Time)
luxon:
Sat Feb 01 2020 00:00:00 GMT+0000 (Coordinated Universal Time)
const { DateTime } = require('luxon')
const { RRule } = require('rrule/dist/es5/rrule-tz.js')

const dtstart = new Date(2020, 1, 1, 0)
const tzid = process.argv[2] || 'Europe/Paris'

const rule = new RRule({
  freq: RRule.WEEKLY,
  dtstart,
  tzid,
  byweekday: [RRule.TU],
  count: 2
})

console.log('rule:\n' + rule.toString())
console.log('events:\n' + rule.all().map(d => d.toString()).join('\n'))

const datetime = DateTime.fromJSDate(dtstart).setZone(tzid)
console.log('luxon:\n' + datetime.toJSDate().toString())

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

مرحبا نفس المشكلة هنا
للتكرار: "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;UNTIL=20200430T040000Z"

rule.all() يظهر TU,WE,TH,FR,SA

ال 3 كومينتر

مرحبا نفس المشكلة هنا
للتكرار: "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;UNTIL=20200430T040000Z"

rule.all() يظهر TU,WE,TH,FR,SA

تحديث: أعتقد أن هذا كان مجرد حيرتي حول السلوك الافتراضي لـ rrule.js فيما يتعلق بإدخالات UTC بالإضافة إلى كائنات JS Date.

كما تم استخلاصه من التعليقات الأخرى ، يبدو هذا الالتباس شائعًا جدًا:
(1) العمل مع TZID
(2) إدخال DTSTART بالتنسيق الصحيح (محلي حسب المنطقة الزمنية ، بدلاً من UTC أو محلي لجهاز الكمبيوتر)
(3) إدخال التواريخ الصحيحة في rrule.between() . في حالة الإعلان عن TZID ، يشبه إلى حد كبير أن تقوم بتدليك التواريخ عند ظهورها - باستخدام DateTime.fromJSDate(date).toUTC().setZone('local', { keepLocalTime: true }) ، يجب عليك تدليك التواريخ التي تذهب إلى between() (على الأرجح after/before as حسنًا) باستخدام DateTime.fromMillis(posixTime).setZone('utc', { keepLocalTime: true }) .

على الرغم من مشاكلي مع التوثيق ، والإحباطات حول السلوك غير الموثق ، أنا ممتن جدًا لوجود هذه المكتبة. شكرا للمبدع وجميع المشرفين والمساهمين. مثل الكثير luxon نما من الدروس المستفادة من moment ، وأعتقد أن التكرار التالي من مكتبة RRULE بناء على أكتاف rrule.js .

تم نشر "المشكلة" الأصلية ، تجاهل ما قلته أدناه.
تواجه أيضًا ما يبدو أنه هذه المشكلة أيضًا.

import { rrulestr } from 'rrule';

const twoWeeks = 1209600000;
const myrrule = ["DTSTART:20200104T000000Z", "RRULE:FREQ=WEEKLY;BYDAY=FR"]
rrulestr(myrrule.join('\n'))
    .between(new Date(Date.now() - twoWeeks), new Date(Date.now() + twoWeeks))

يؤدي هذا إلى إرجاع قائمة التواريخ التي تحدث يوم الخميس.
لقد تأكدت من أن DTSTART هو UTC.

يقع الحدث المعني يوم الجمعة الساعة 18: 00-0600 (توقيت الجبل) ، وهو نفس يوم السبت 00: 00-UTC ، لكن rrule.between() يُرجع الأوقات @ الخميس 18: 00-0600 بشكل غريب.

سأحاول بكل سرور تشريح الكود لمعرفة مكان / كيفية حدوث المشكلة. إذا كان لدى أي شخص أكثر دراية بقاعدة الشفرة بعض النصائح لتوجيهي إلى الاتجاه الصحيح ، فيرجى إبلاغي بذلك ، شكرًا!

تضمين التغريدة لقد كنت أعمل مع القاعدة ، خلال الأيام الخمسة الماضية ولا يمكنني معرفة كيفية التعامل مع المناطق الزمنية. إذا قضيت الوقت في الساعة 9 مساءً ، يتم تحويل وقتي إلى الساعة 4 صباحًا بالتوقيت العالمي المنسق. يتسبب هذا في مشكلة عندما أرغب في تعيين أحداث متكررة في أيام معينة ، دعنا نقول أيام الجمعة. ثم يتكرر يوم الجمعة 4 صباحًا ، وعندما تتم ترجمته مرة أخرى إلى المنطقة الزمنية الخاصة بي ، يكون الخميس 9 مساءً عندما أردته يوم الجمعة. هل لديك أي اقتراحات لهذا؟ حاولت مع tzid لكنني لا أستطيع أن أجعل ذلك يعمل أيضًا. لست متأكدا كيف من المفترض أن أدمج Luxon؟ لقد قمت بتنزيل الحزمة.

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

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

fatshotty picture fatshotty  ·  5تعليقات

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

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

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

Prinzhorn picture Prinzhorn  ·  15تعليقات