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
рдореИрдВрдиреЗ рдЗрд╕ рд░реЗрдкреЛ рдХреЛ рдХреНрд▓реЛрди рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЬреЛрдбрд╝рд╛:
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()
рд╕рд╛рде рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрд╛ рд╣реИ:
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