Rrule: TZID рдХреЗ рд╕рд╛рде DTSTART: рдмреАрдЪ рдореЗрдВ рдЧрд▓рдд рд╕рдордп рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ

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

рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛

const ruleStr = [
'DTSTART;TZID=America/Los_Angeles:20190603T181500', 
'RRULE:FREQ=WEEKLY;WKST=SU;BYDAY=MO,TU,WE,FR,SA'
].join('\n')
const rule = RRule.fromString(ruleStr)
const result = rule.between(
new Date('2019-07-16T07:00:00.000-07:00'), 
new Date('2019-07-23T07:00:00.000-07:00')
)
console.log(result)

рдЗрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ:

0:Tue Jul 16 2019 15:15:00 GMT-0500 (CDT) {}
1:Wed Jul 17 2019 15:15:00 GMT-0500 (CDT) {}
2:Fri Jul 19 2019 15:15:00 GMT-0500 (CDT) {}
3:Sat Jul 20 2019 15:15:00 GMT-0500 (CDT) {}
4:Mon Jul 22 2019 15:15:00 GMT-0500 (CDT) {}

15:15:00 GMT-0500 (CDT) 17:15 PDT рд╣реИ, рдЬрдмрдХрд┐ DTSTART DTSTART;TZID=America/Los_Angeles:20190603T181500

рдЬрдм рдореИрдВ @davidgoli рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд tzid рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ:

const ruleStr = [
'DTSTART:20190603T181500', 
'RRULE:FREQ=WEEKLY;WKST=SU;BYDAY=MO,TU,WE,FR,SA'
].join('\n')
const rule = RRule.fromString(ruleStr)
const ruleSet = new RRuleSet()
ruleSet.rrule(rule)
ruleSet.tzid('America/Los_Angeles')
const result = ruleSet.between(
new Date('2019-07-16T07:00:00.000-07:00'), 
new Date('2019-07-23T07:00:00.000-07:00')
)
console.log(result)
0:Tue Jul 16 2019 13:15:00 GMT-0500 (CDT) {}
1:Wed Jul 17 2019 13:15:00 GMT-0500 (CDT) {}
2:Fri Jul 19 2019 13:15:00 GMT-0500 (CDT) {}
3:Sat Jul 20 2019 13:15:00 GMT-0500 (CDT) {}
4:Mon Jul 22 2019 13:15:00 GMT-0500 (CDT) {}

рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рд╣реИ:

0:Tue Jul 16 2019 20:15:00 GMT-0500 (CDT) {}
1:Wed Jul 17 2019 20:15:00 GMT-0500 (CDT) {}
2:Fri Jul 19 2019 20:15:00 GMT-0500 (CDT) {}
3:Sat Jul 20 2019 20:15:00 GMT-0500 (CDT) {}
4:Mon Jul 22 2019 20:15:00 GMT-0500 (CDT) {}

рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реИ?
рдирд┐рдпрдо рд╕рдВрд╕реНрдХрд░рдг: 2.6.2
рдореИрдВ рд╕реАрдбреАрдЯреА рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдХреЗ рддрд╣рдд рдиреЛрдб рдЪрд▓рд╛рддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рд╕рд┐рд╕реНрдЯрдо рд╕рдордп рдХреНрд╖реЗрддреНрд░ America/Los_Angeles

рд╕рднреА 16 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВрдиреЗ рдЗрд╕ рд░реЗрдкреЛ рдХреЛ рдХреНрд▓реЛрди рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЬреЛрдбрд╝рд╛:

  it('generates correct recurrences when recurrence is WEEKLY and has BYDAY specified', () => {
    const rrule = new RRule({
      freq: RRule.WEEKLY,
      dtstart: new Date(Date.UTC(2019, 6, 17, 18, 0, 0)),
      tzid: 'America/Los_Angeles',
      count: 10,
      interval: 1,
      wkst: RRule.SU,
      byweekday: [RRule.MO, RRule.TU, RRule.WE, RRule.FR, RRule.SA]
    })

    expect(rrule.all()).to.deep.equal([
      new Date('2019-07-17T18:00:00.000-07:00'), // WE
      new Date('2019-07-19T18:00:00.000-07:00'), // FR
      new Date('2019-07-20T18:00:00.000-07:00'), // SA
      new Date('2019-07-22T18:00:00.000-07:00'), // MO
      new Date('2019-07-23T18:00:00.000-07:00'), // TU
      new Date('2019-07-24T18:00:00.000-07:00'),
      new Date('2019-07-26T18:00:00.000-07:00'),
      new Date('2019-07-27T18:00:00.000-07:00'),
      new Date('2019-07-29T18:00:00.000-07:00'),
      new Date('2019-07-30T18:00:00.000-07:00')
    ])
  })

рдпрд╣ рддрднреА рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдореИрдВ рдЗрд╕реЗ рдпреВрдЯреАрд╕реА рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдХреЗ рддрд╣рдд рдЪрд▓рд╛рддрд╛ рд╣реВрдВ (рдЬрдм рдореИрдВ "env": { "TZ": "UTC" } рдореЗрдВ launch.json рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ)ред рдкрд░реАрдХреНрд╖рдг рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред
@davidgoli рдпрд╣ рдЗрд░рд╛рджрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдпрд╣рд╛рдБ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдБ, рддреЛ tzid рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдареАрдХ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП rrule рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рднреА рдпрд╣реА рдореБрджреНрджрд╛ рд╣реИ рд▓реЗрдХрд┐рди rrule.all() рдХреЗ рд╕рд╛рдеред рдпреВрдЯреАрд╕реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХреЛрдИ рдЕрдиреНрдп рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдСрдлрд╕реЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ rrule-tz.js рдХреА рд▓рд╛рдЗрди 1849 рд╕реЗ рдХреБрдЫ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

var rezonedDate = rezoneIfNeeded(res, options);

rezoneIfNeeded , рдЗрд╕рдХреЗ рдирд╛рдо рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреЛрдИ рднреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрдм рддрдХ рдпрд╣ рдпреВрдЯреАрд╕реА рдирд╣реАрдВ рд╣реИ рддрдм рддрдХ рд╣рдореЗрд╢рд╛ рд░реЗрдЬреЛрди рдХрд░рддрд╛ рд╣реИред

function rezoneIfNeeded(date, options) { return new datewithzone_DateWithZone(date, options.tzid).rezonedDate(); }

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддрд╛рд░реАрдЦ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬрд╝реЛрди рдХрд░ рд░рд╣рд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЬрд╝реЛрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред

rezonedDate() рдХреЛ рдХреЗрд╡рд▓ this.date рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЪреАрдЬреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣реАрдВ рдФрд░ рдХреБрдЫ рддреЛрдбрд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд░рд╕рд░реА рдирдЬрд╝рд░ рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдпрд╣ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдмрд╛рдХреА рд╕рдм рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ rrule-tz.js рдХреА рд▓рд╛рдЗрди 1849 рд╕реЗ рдХреБрдЫ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

var rezonedDate = rezoneIfNeeded(res, options);

rezoneIfNeeded , рдЗрд╕рдХреЗ рдирд╛рдо рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреЛрдИ рднреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрдм рддрдХ рдпрд╣ рдпреВрдЯреАрд╕реА рдирд╣реАрдВ рд╣реИ рддрдм рддрдХ рд╣рдореЗрд╢рд╛ рд░реЗрдЬреЛрди рдХрд░рддрд╛ рд╣реИред

function rezoneIfNeeded(date, options) { return new datewithzone_DateWithZone(date, options.tzid).rezonedDate(); }

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддрд╛рд░реАрдЦ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬрд╝реЛрди рдХрд░ рд░рд╣рд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЬрд╝реЛрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред

рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред rezonedDate рд╡рд┐рдзрд┐ рдпрд╣ рдЬрд╛рдВрдЪрддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ tzid рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рд╣реИ рдХрд┐ рдЬрд╝реЛрди рдСрдлрд╝рд╕реЗрдЯ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

@agordeev рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ @ hlee5zebra рдХрд╛ "рдлрд┐рдХреНрд╕" рдХреЗрд╡рд▓ tzid рдкрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ?

рднрд▓реЗ рд╣реА, RRule рдФрд░ RRuleSet рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмреАрдЪ рдЕрд╕рдВрдЧрддрд┐ рдореЗрд░реЗ рдФрд░ рд╢рд╛рдпрдж рдПрдХ рдмрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдЬрд┐рд╕реЗ рдЧрд╣рд░рд╛рдИ рд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдореБрдЭреЗ рд╡рд╣ рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИ рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рд╣реБрдИ - рдореЗрд░рд╛ рд╕рд░реНрд╡рд░ рдХреЛрдб DTSTART рдорд╛рди рд╕рдордп рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд░рд╣рд╛ рдерд╛, UTC рдореЗрдВ рдЧреБрдЬрд░ рд░рд╣рд╛ рдерд╛ рдЬрдм рдЗрд╕реЗ TZID рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢рд╛рдпрдж рдпрд╣ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ @agordeev рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж @davidgoli рдореБрдЭреЗ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдкрд░ рдареЛрдХрд░ рдЦрд╛ рд╕рдХрддрд╛ рд╣реВрдВред toString() рдореЗрдВ datewithzone.ts toString() рд╡рд┐рдзрд┐ рдПрдХ UTC рд╕рдордп рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧреА рдЬрдм рдПрдХ TZID рдХреА рдЖрдкреВрд░реНрддрд┐ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрдм рдЗрд╕реЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд╕рдордп рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@ hlee5zebra рдЗрд╕ рдкрд╛рда рдХреЛ README рдореЗрдВ рдиреЛрдЯ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ:

https://github.com/jakubroztocil/rrule#important -use-utc-dates

рдорд╣рддреНрд╡рдкреВрд░реНрдг: рдпреВрдЯреАрд╕реА рддрд┐рдерд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рддрд┐рдерд┐рдпрд╛рдВ рдореБрд╢реНрдХрд┐рд▓ рд╣реИрдВред RRule рдХрд┐рд╕реА рднреА рдмрдбрд╝реА рдЖрд╡рд╢реНрдпрдХ рддреГрддреАрдп рдкрдХреНрд╖ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдпрдерд╛рд╕рдВрднрд╡ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗрдкрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдо рднреА рд╣реИрдВред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, RRule "рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ" рд╕рдордп рдпрд╛ UTC рдЯрд╛рдЗрдордЬрд╝реЛрди рдореЗрдВ рдбреАрд▓ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ RRule рд╕рдордпрдХреНрд╖реЗрддреНрд░ рд╕рдорд░реНрдерди рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд "рдЯрд╛рдЗрдордЬрд╝реЛрди" рдСрдлрд╝рд╕реЗрдЯ рдмрд╕ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрд╕ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рд╣рд░ рд╕рдордп рд╢реВрдиреНрдп рдСрдлрд╝рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рдерд╛ред

рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ рд▓реМрдЯрд╛рдИ рдЧрдИ "рдпреВрдЯреАрд╕реА" рддрд┐рдерд┐рдпрд╛рдВ рд╣рдореЗрд╢рд╛ рдЖрдкрдХреЗ рд╕реНрдерд╛рдиреАрдп рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рддрд┐рдерд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдСрдлрд╕реЗрдЯ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде "рд╕рд╣реА" рд╕реНрдерд╛рдиреАрдп рд╕рдордп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдпреВрдЯреАрд╕реА рдореЗрдВ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдЬреИрд╕реЗред рдирдИ рддрд┐рдерд┐ (рджрд┐рдирд╛рдВрдХ.рдпреВрдЯреАрд╕реА(...))ред рд▓реМрдЯрд╛рдИ рдЧрдИ рддрд┐рдерд┐рдпрд╛рдВ рднреА рдпреВрдЯреАрд╕реА рдореЗрдВ рд╣реЛрдВрдЧреА (рдХреНрд░реЛрдо рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЬреЛ рд╣рдореЗрд╢рд╛ рдЯрд╛рдЗрдордЬрд╝реЛрди рдСрдлрд╝рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рддрд┐рдерд┐рдпрд╛рдВ рд▓реМрдЯрд╛рддреА рд╣реИ)ред

рдЕрдзрд┐рдХрд╛рдВрд╢ рдЬреЗрдПрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рд┐рдХрди рд╣реИ, рдЖрдк рдпрд╛ рддреЛ рдпреВрдЯреАрд╕реА рдСрдлрд╝рд╕реЗрдЯ _or_ рд╕реНрдерд╛рдиреАрдп рдСрдлрд╝рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдирдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред рддреЛ рдПрдХ "рдпреВрдЯреАрд╕реА рддрд┐рдерд┐" рдХреЛ toString() рджреЗрдХрд░ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рдЬрдЧрд╣реЛрдВ рдкрд░ рдСрдлрд╝рд╕реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИ, рди рдХрд┐ рджреВрд╕рд░реЛрдВ рдореЗрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд░реЛрдо рдореЗрдВ:

> new Date(Date.UTC(2016, 10, 5))
Fri Nov 04 2016 17:00:00 GMT-0700 (Pacific Daylight Time)

рд▓реЗрдХрд┐рди рдиреЛрдб рдореЗрдВ:

> new Date(Date.UTC(2016, 10, 5))
2016-11-05T00:00:00.000Z

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕рд░реНрд╡реЛрддреНрддрдо рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП, toString() рдорд╛рди рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ toISOString() рдФрд░ getUTCHours() (рдЖрджрд┐) рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг - рд╕рднреА рддрд┐рдерд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ UTC рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдп рд╕рдордп рдореЗрдВ "рд╡реНрдпрд╛рдЦреНрдпрд╛" рдХрд░рдирд╛ - rrule_ рдХреЗ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ rrule рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХрд╛ рдПрдХ рд╕рдорд╛рди рддрд░реАрдХрд╛ рджреЗрддрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ rrule.all() рд╕рд╛рде рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрд╛ рд╣реИ:

  1. рдореИрдВрдиреЗ 'рдЕрдореЗрд░рд┐рдХрд╛/рдПрдбрдХ', 'рдЕрдореЗрд░рд┐рдХрд╛/рд╢рд┐рдХрд╛рдЧреЛ' (рдореЗрд░рд╛ рд╕реНрдерд╛рдиреАрдп рд╕рдордп), 'рдЕрдореЗрд░рд┐рдХрд╛/рдиреНрдпреВрдпреЙрд░реНрдХ', рдФрд░ 'рдпреВрдЯреАрд╕реА' рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдордп рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рднреАрддрд░ рдбреАрдЯреАрд╕реНрдЯрд╛рд░реНрдЯ рдХреЛ рдордзреНрдпрд░рд╛рддреНрд░рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдореА rrule.toString() рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдореБрджреНрд░рд┐рдд рд╣реИ:
>> rRule.toString()
"DTSTART;TZID=America/Adak:20190718T000000
RRULE:FREQ=DAILY"

>> rRule.toString()
"DTSTART;TZID=America/Chicago:20190718T000000
RRULE:FREQ=DAILY"

>> rRule.toString()
"DTSTART;TZID=America/New_York:20190718T000000
RRULE:FREQ=DAILY"

>> rRule.toString()
"DTSTART:20190718T000000Z
RRULE:FREQ=DAILY"

rrule.all() рдореЗрдВ рдкрд╛рд░рд┐рдд рдЗрдЯрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╕рдордп, рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг date рдкреНрд░рддреНрдпреЗрдХ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдкреНрд░рддреНрдпреЗрдХ Date рдХреЛ .toISOString() рдорд╛рдзреНрдпрдо рд╕реЗ рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдЕрдореЗрд░рд┐рдХрд╛/рдЕрджрдХ:
"2019-07-18T04:00:00.000Z"

рдЕрдореЗрд░рд┐рдХрд╛/рд╢рд┐рдХрд╛рдЧреЛ:
"2019-07-18T00:00:00.000Z"

рдЕрдореЗрд░рд┐рдХрд╛/рдиреНрдпреВрдпреЙрд░реНрдХ:
"2019-07-17T23:00:00.000Z"

рдпреБ.рдЯреА. рд╕реА:
"2019-07-18T00:00:00.000Z"

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдпреВрдЯреАрд╕реА (рдЬреИрд╕реЗ рдЕрдореЗрд░рд┐рдХрд╛/рдПрдбрдХ, рдЕрдореЗрд░рд┐рдХрд╛/рдиреНрдпреВрдпреЙрд░реНрдХ) рдкрд░ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рд╕реНрдерд╛рдиреАрдп рд╕рдордп рдФрд░ рдЪрдпрдирд┐рдд рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдХреЗ рдмреАрдЪ рдХреА рдСрдлрд╕реЗрдЯ рдХреЛ DTSTART рддрд┐рдерд┐ рд╕реЗ рдШрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдиреНрдпреВрдпреЙрд░реНрдХ рдЖрдИрдПрд╕рдУ рд╕реНрдЯреНрд░рд┐рдВрдЧ 23:00 рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рд╕реНрдерд╛рдиреАрдп рд╕рдордп рдФрд░ рдиреНрдпреВрдпреЙрд░реНрдХ рдХреЗ рдмреАрдЪ рдСрдлрд╕реЗрдЯ +1 рд╣реИ, рдЬрд┐рд╕реЗ 07/18/2019 рдХреЛ рдордзреНрдпрд░рд╛рддреНрд░рд┐ рд╕реЗ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬреЛ 07/17 рдХреЛ 11 рдмрдЬреЗ рд╣реИ /2019.

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдпреВрдЯреАрд╕реА рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЙрддреНрд╕реБрдХ рд╣реИред

рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдХреЛрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЪреВрдХ рдЧрдпрд╛ рд╣реЛ?

рдореИрдВ рдЬреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдЙрд╕рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореБрдЭреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ Date рдПрдХ рд╕рдЯреАрдХ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ:

rRule.all(function (date, i) {
    if (this.getSelectedTzid() !== 'UTC') {
        date = moment.tz({
            year: date.getUTCFullYear(),
            month: date.getUTCMonth(),
            date: date.getUTCDate(),
            hours: date.getUTCHours(),
            minutes: date.getUTCMinutes()
        }, this.getLocalTzid()).toDate();
    }

    ...
}.bind(this));

@ hlee5zebra рд╣рд╛рдВ, getUTCxxx рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЖрдкрдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд░реАрдбрдореА рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╕рд╣реА рд╣реИред

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпреВрдЯреАрд╕реА рд╕рдордп рдореЗрдВ рдЫрджреНрдо-рдпреВрдЯреАрд╕реА рддрд┐рдерд┐ рд▓рдЧрднрдЧ _really_ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред UTC рдХреЗрд╡рд▓ "рддрдЯрд╕реНрде" рд╕рдордпрдХреНрд╖реЗрддреНрд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рднрд╛рд░рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП getUTCxxx рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореВрд▓ рдХреНрд╖реЗрддреНрд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ _local_ рд╕рдордп рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдЖрдкрдХреЛ tzid рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╡рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдЦрдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рд╕рдордпрдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рд╕рдордпрдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХрд░реЗрдВрдЧреЗред tzid рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд╛рдиреАрдп рд╕рдордп _рдПрдХ рднрд┐рдиреНрди рд╕рдордпрдХреНрд╖реЗрддреНрд░_рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕реНрдерд╛рдиреАрдп рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реЛ, рддреЛ рдЖрдкрдХреЛ tzid рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдореЗрд░рд╛ рдкреБрдирд░реНрд▓реЗрдЦрди рдмрд┐рд▓реНрдЯрд┐рди рдЬреЗрдПрд╕ рдбреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдмрд╕ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

@agordeev рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ @ hlee5zebra рдХрд╛ "рдлрд┐рдХреНрд╕" рдХреЗрд╡рд▓

рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдбреЗрд╡рд┐рдб рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

    const rrule = new RRule({
      freq: RRule.WEEKLY,
      dtstart: new Date(Date.UTC(2019, 6, 17, 18, 0, 0)),
      // tzid: 'America/Los_Angeles',
      count: 10,
      interval: 1,
      wkst: RRule.SU,
      byweekday: [RRule.MO, RRule.TU, RRule.WE, RRule.FR, RRule.SA]
    })

рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ:

  -  [Date: 2019-07-17T18:00:00.000Z]
  -  [Date: 2019-07-19T18:00:00.000Z]
  -  [Date: 2019-07-20T18:00:00.000Z]
  -  [Date: 2019-07-22T18:00:00.000Z]
  etc..

рддреЛ рджрд┐рдирд╛рдВрдХ/рд╕рдордп рд╕рд╣реА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдпреВрдЯреАрд╕реА рд╣реИред рдЬрдм рдореИрдВ tzid param рдХреЛ рдЫреЛрдбрд╝рддрд╛ рд╣реВрдБ рддреЛ rrule UTC рдореЗрдВ DTSTART рдХреЛ рдорд╛рдирддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕реНрдерд╛рдиреАрдп рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реЛ, рддреЛ рдЖрдкрдХреЛ tzid рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рдЙрд╕ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдХреЛ tzid param рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реИ? рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рд╕рд░реНрд╡рд░ рдкрд░ рдиреЛрдб.рдЬреЗрдПрд╕ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕реНрдерд╛рдиреАрдп рд╕рдордп рдореЗрдВ _рд╕рдордпрдХреНрд╖реЗрддреНрд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ 1800 рдкрд░ рд╣реЛрдЧреА, рддреЛ рдЖрдкрдХреЛ tzid рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдХреГрдкрдпрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рд░реАрдбрдореЗ рдореЗрдВ рд╡рд░реНрдгрд┐рдд "рдлреНрд▓реЛрдЯрд┐рдВрдЧ" рд╕рдордп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рд╛ рд╣реИ: https://github.com/jakubroztocil/rrule#important -use-utc-dates

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

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

fatshotty picture fatshotty  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

Prinzhorn picture Prinzhorn  ┬╖  15рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

michaelkrog picture michaelkrog  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ