Rrule: toString рдореЗрдВ DTSTART рдЖрдЙрдЯрдкреБрдЯ рди рдХрд░реЗрдВ ()

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рдЬрдире░ 2015  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jakubroztocil/rrule

DTSTART рдФрд░ DTEND iCalendar RRULE рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ .toString() рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╢рд╛рдпрдж "DTSTART=x;DTEND=x;RRULE=x" рдЬреИрд╕рд╛ рдХреБрдЫ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ рдЬреЛ рд╡реИрдз iCalendar рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛрдЧрд╛ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

:+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 рдФрд░ рдПрдХ рд╕реНрдЯрд╛рд░реНрдЯрдбреЗрдЯ рджреЗрддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ рдЗрд╕реЗ Moment рддрд┐рдерд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдЕрдк рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдорд┐рд▓рддрд╛ рд╣реИ) рдФрд░ рдпрд╣ рдХрд┐рд╕реА рднреА ;DTSTART=...; рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдЖрд░рдЖрд░рдпреВрдПрд▓рд╕реЗрдЯред рдЗрд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдирд┐рдпрдорд╕реЗрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ, рдареАрдХ рд╕реЗ рд╕реНрд╡рд░реВрдкрд┐рдд DTSTART рдЕрдиреБрднрд╛рдЧ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдпрд╣ рд╕рднреА рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рдиреЛрдЯ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ DTSTART рдорд╛рди рдореМрдЬреВрдж рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ iCalendar рдлреНрд▓реЗрд╡рд░ рд╣реЛрдВ рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ (рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд╣рд░)ред

рдПрдХ рдЖрдЬреНрдЮрд╛рдХрд╛рд░реА рдирд┐рдпрдо рд╕реНрдЯреНрд░рд┐рдВрдЧ (DTSTART рдХреЗ рдмрд┐рдирд╛) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╕реАрдзреЗ 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 рдХреА рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдкрд╛рдЗрдерди рдХреЗ dateutil рдХреЗ рд╕рд╛рде рдкреНрд▓рдЧ рдФрд░ рдЦреЗрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рд╕рд╣рдордд, RFC рдФрд░ Python рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдХреБрдЫ рдЕрдВрддрд░ рд╣реИрдВред рдЗрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЦреБрд▓рд╛ рд╣реЛрдЧрд╛!

рдЕрдм рдЬрдмрдХрд┐ TZID рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (#261), рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрдм рдЙрди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ рдЬреЛ рдЗрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреА рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреВрд░реНрд╡-2.4.0 рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП, рд▓реЗрдХрд┐рди RFC- рдЕрдиреБрд░реВрдк рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдХреЗ рдПрдХ рдкрд╢реНрдЪ-рд╕рдВрдЧрдд рд╕рдорд╛рдзрд╛рди рддрдХ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

^ рдореЗрд░рд╛ рдЖрдЦрд┐рд░реА рдмрдпрд╛рди рдпрд╣рд╛рдВ ("рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрдм рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ") рдЕрдм рдЧрд▓рдд рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл # 267 рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдлрд┐рд░ рднреА, RFC рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЖрджрд░реНрд╢ рд╣реЛрдЧрд╛!

#269 . рджреНрд╡рд╛рд░рд╛ рддрдп

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

mapidemic picture mapidemic  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

anthwinter picture anthwinter  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

spurreiter picture spurreiter  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

grigio picture grigio  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

shorlbeck picture shorlbeck  ┬╖  21рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ