DTSTART dan DTEND bukan bagian dari iCalendar RRULE dan tidak boleh disertakan saat melakukan .toString().
Mungkin menghasilkan sesuatu seperti "DTSTART=x;DTEND=x;RRULE=x" yang merupakan sintaks iCalendar yang valid.
juga ditambah 1 ini
Setuju - ini menyebabkan beberapa kesedihan saat beroperasi dengan implementasi lain (misalnya _Python dateutil_)
:+1: untuk masalah ini
AFAIK, DTSTART selalu seharusnya menjadi baris yang berbeda, tidak hanya dibatasi oleh ;
, jadi seperti contoh yang dirujuk di #84 (baris baru signifikan):
DTSTART;TZID=US-Eastern:19970902T090000
RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR
Saya tidak _berpikir_ (tetapi menunggu koreksi jika salah) bahwa menggabungkan baris-baris ini dengan ;
adalah RFC 5545 yang valid.
@jkbrzt apakah Anda menerima Permintaan Tarik untuk ini?
Karena ini akan menjadi perubahan yang melanggar, saya dapat membayangkan menerapkannya dalam fungsi yang terpisah, misalnya icalString()
dan memberikan opsi untuk pengurai juga.
Untuk siapa pun yang mengalami masalah ini, saya membuat fungsi pembantu yang tampaknya berfungsi untuk kebutuhan saya (catatan: ini ditulis dalam TypeScript)
export function rrulesetToIcalString(schedule: RRuleSet, startDate: Moment): string {
// matches `;DTSTART=20180125T080000Z` until `;` or end
const icalStrings = schedule.valueOf().map(ruleString => ruleString.replace(/;DTSTART=.*?(?=(?:;)|$)/, ''));
icalStrings.unshift(`DTSTART;TZID=UTC:${startDate.utc().format('YYYYMMDDTHHmmss')}`);
return icalStrings.join('\n');
}
Anda memberinya RRuleSet
dan tanggal mulai (saya mengaturnya untuk digunakan dengan tanggal Moment
, tetapi Anda mendapatkan idenya) dan itu melewati dan menghapus bagian ;DTSTART=...;
di RRuleSet. Kemudian menambahkan satu bagian DTSTART
yang diformat dengan benar di awal RuleSet, dan kemudian menggabungkan semua bagian bersama-sama.
Catatan: Saya _think_ hanya ada satu nilai DTSTART
yang ada. Mungkin ada rasa iCalendar di mana ini tidak benar (di luar kasus penggunaan saya).
Untuk mendapatkan string aturan yang sesuai (tanpa DTSTART), salah satu opsi adalah menggunakan RRule.optionsToString
secara langsung:
var rule = new RRule({
freq: RRule.WEEKLY,
interval: 5,
byweekday: [RRule.MO, RRule.FR],
dtstart: new Date(2012, 1, 1, 10, 30),
until: new Date(2012, 12, 31)
});
var copy = Object.assign({}, rule.origOptions);
delete copy.dtstart
RRule.optionsToString(copy)
Ada pembaruan tentang ini? Tidak terlalu sulit untuk mendapatkan string rrule yang sesuai, terima kasih atas saran @phillbaker , tetapi alangkah baiknya jika dapat plug and play dengan dateutil.js Python.
Setuju, ada beberapa perbedaan sintaks dengan RFC dan dengan Python. Akan sangat terbuka untuk permintaan tarik yang menangani ini!
Sekarang TZID
telah diimplementasikan (#261), perpustakaan tidak dapat lagi mengurai string yang dihasilkannya. Saya pikir solusi yang kompatibel ke belakang dapat dicapai dengan terus mengurai string keluaran pra-2.4.0, tetapi mengeluarkan string yang sesuai dengan RFC.
^ pernyataan terakhir saya di sini ("perpustakaan tidak dapat lagi mengurai string yang dihasilkannya") sekarang salah, ini baru saja diperbaiki oleh #267. Namun, akan ideal untuk menyesuaikan diri dengan RFC!
Diperbaiki oleh #269
Komentar yang paling membantu
:+1: untuk masalah ini
AFAIK, DTSTART selalu seharusnya menjadi baris yang berbeda, tidak hanya dibatasi oleh
;
, jadi seperti contoh yang dirujuk di #84 (baris baru signifikan):Saya tidak _berpikir_ (tetapi menunggu koreksi jika salah) bahwa menggabungkan baris-baris ini dengan
;
adalah RFC 5545 yang valid.