Rrule: Jangan menampilkan DTSTART di toString()

Dibuat pada 25 Jan 2015  ·  11Komentar  ·  Sumber: jakubroztocil/rrule

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.

enhancement

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):

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.

Semua 11 komentar

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat