Rrule: toString()でDTSTARTを出力しないでください

作成日 2015年01月25日  ·  11コメント  ·  ソース: jakubroztocil/rrule

DTSTARTおよびDTENDはiCalendarRRULEの一部ではないため、.toString()を実行するときに含めるべきではありません。

おそらく、有効なiCalendar構文である「DTSTART = x; DTEND = x; RRULE=x」のようなものを生成します。

enhancement

最も参考になるコメント

:+1:この問題の場合

AFAIK、DTSTARTは、 ;で区切られているだけでなく、常に別の行であると想定されているため、#84で参照されている例のように(改行は重要です):

DTSTART;TZID=US-Eastern:19970902T090000
RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR

これらの行を;と連結することが有効なRFC 5545であるとは_考えません_(ただし、間違っている場合は修正を待ちます)。

全てのコメント11件

またプラス1これ

同意しました-これは、他の実装(_Python dateutil_など)と相互運用するときにいくつかの悲しみを引き起こしています

:+1:この問題の場合

AFAIK、DTSTARTは、 ;で区切られているだけでなく、常に別の行であると想定されているため、#84で参照されている例のように(改行は重要です):

DTSTART;TZID=US-Eastern:19970902T090000
RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR

これらの行を;と連結することが有効なRFC 5545であるとは_考えません_(ただし、間違っている場合は修正を待ちます)。

@jkbrztこれに対するプルリクエストを受け入れますか?

これは重大な変更になるため、 icalString()などの別の関数で実装し、パーサーにもオプションを与えることを想像できます。

この問題に遭遇した他の人のために、私は自分のニーズに合っているように見えるヘルパー関数を作成しました(注:タイプスクリプトで書かれています)

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');
}

RRuleSetとstartDate( Momentの日付で使用するように設定しましたが、アイデアはわかります)を指定すると、の;DTSTART=...;セクションがすべて削除されます。 RRuleSet。 次に、RuleSetの先頭に適切にフォーマットされDTSTARTセクションを1つ追加してから、すべてのセクションを結合します。

注: DTSTARTの値が1つだけ存在すると思います。 ただし、これが当てはまらないiCalendarフレーバーがあるかもしれません(私のユースケース以外)。

(DTSTARTなしで)準拠したrrule文字列を取得するには、 RRule.optionsToStringを直接使用するオプションがあります。

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)

これに関する更新はありますか? @phillbakerのアドバイスのおかげで、準拠したrrule文字列を取得するのはそれほど難しくありませんが、Pythonのdateutilをプラグアンドプレイできると便利です。

同意しました。RFCとPythonの構文にはいくつかの違いがあります。 これに対処するプルリクエストに対して非常にオープンになります!

TZIDが実装されたので(#261)、ライブラリは出力する文字列を解析できなくなります。 2.4.0より前の出力文字列の解析を続行し、RFC準拠の文字列を出力することで、下位互換性のあるソリューションに到達できると思います。

^ここでの私の最後のステートメント(「ライブラリは出力する文字列を解析できなくなりました」)が正しくなくなりました。これは#267で修正されました。 それでも、RFCに準拠することが理想的です。

#269で修正

このページは役に立ちましたか?
0 / 5 - 0 評価