Rrule: DTSTART๋ฅผ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2015๋…„ 01์›” 25์ผ  ยท  10์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: jakubroztocil/rrule

iCalendar ์‚ฌ์–‘์— ๋”ฐ๋ฅด๋ฉด:

 The "DTSTART" property defines the first instance in the recurrence set.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 Every other week on Monday, Wednesday and Friday until December 24,
 1997, but starting on Tuesday, September 2, 1997:

 DTSTART;TZID=US-Eastern:19970902T090000
 RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;
  BYDAY=MO,WE,FR
 ==> (1997 9:00 AM EDT)September 2,3,5,15,17,19,29;October
 1,3,13,15,17
     (1997 9:00 AM EST)October 27,29,31;November 10,12,14,24,26,28;
                       December 8,10,12,22

rrule.js๋Š” 9์›” 2์ผ์„ ๋ฐœ์ƒ์œผ๋กœ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. rrule.js์—์„œ ์ฒซ ๋ฒˆ์งธ ๋ฐœ์ƒ์€ 9์›” 3์ผ์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ธฐ๋ณธ์ ์œผ๋กœ dtstart ๋Š” ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๊ณผ ๋” ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋™์ž‘์˜ ๋ฏธ๋ฌ˜ํ•จ์„ ๋ณด์—ฌ์ฃผ๋Š” ์ฝ”๋“œํŽœ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. https://codepen.io/arshaw/pen/qwEQNO?editors=0010

๋ชจ๋“  10 ๋Œ“๊ธ€

์—ฌ๊ธฐ์— ํ”Œ๋Ÿฌ์Šค 1. RRule์€ ๋ฐ๋ชจ ์•ฑ์˜ ์‹œ์ž‘ ๋‚ ์งœ/๊ธฐ๊ฐ„์„ ์ „ํ˜€ ์ค€์ˆ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. Google RFC 2445 Java lib๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ด๊ฒƒ์ด ์ €๋ฅผ ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค.

:+1: ์ด๊ฒƒ์ด ํ‘œ์ค€(๋ฐ Google ์บ˜๋ฆฐ๋”, Apple(Mac OS/iOS/iCloud) ์บ˜๋ฆฐ๋”์™€ ๊ฐ™์€ ํ˜ธํ™˜ ์‹œ์Šคํ…œ)์˜ ์ž‘๋™ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

@jkbrzt , ํ˜„์žฌ rrule.js๋Š” python dateutil์˜ ๊ธฐ๋Šฅ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

RFC์— ๋ฌธ์„œํ™”๋œ ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ ์‹œ์ž‘ ๋‚ ์งœ/์‹œ๊ฐ„(dtstart)์€ ์ง€์ •๋œ ๊ทœ์น™์— ๋งž์ง€ ์•Š๋Š” ํ•œ ์ฒซ ๋ฒˆ์งธ ๋ฐ˜๋ณต ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
โ€“โ€“ dateutil ๋ฌธ์„œ

์ด๊ฒƒ์€ dateutil์—์„œ ํฌ๊ฒŒ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ๊ฒฝ์šฐ์— ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๊ฐ? ๋ณ€ํ™”๋ฅผ ์ง€์ง€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@hwangmoretime rrule.js ๊ฐ€ RFC์™€ ๋‹ค๋ฅธ ์ ์„ ๋ฌธ์„œํ™”ํ•œ README์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณ‘ํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, rrule.js ์ค€์ˆ˜ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(์ด ๋ฌธ์ œ + byday ํ‚ค์›Œ๋“œ ์ธ์ˆ˜). ํ•˜์ง€๋งŒ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ž˜ ๋ฌธ์„œํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ all() ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ between ๋ฉ”์„œ๋“œ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์—์„œ๋Š” readme์— ๋”ฐ๋ผ RRuleSet ๊ฐœ์ฒด์— dtstart ๋ฐ rdate ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

screen shot 2016-03-19 at 1 41 49 pm

๊ทœ์น™ ์ง‘ํ•ฉ
RRuleSet {_cache: Object, _rrule: Array[1], _rdate: Array[1], _exrule: Array[0], _exdate: Array[0]}

rruleSet.valueOf()
["RRULE:FREQ=YEARLY;DTSTART=20120122T000000Z;INTERVAL=1;WKST=0;BYMONTH=3;BYMONTHDAY=19;BYHOUR=13;BYMINUTE=39;BYSECOND=27", "RDATE:20120122T000000Z"]

rruleSet.all()[0]
Sat Jan 21 2012 16:00:00 GMT-0800 (PST)

rruleSet.between(startDatetime, endDatetime)
[Sat Mar 19 2016 13:39:27 GMT-0700 (PDT)]

all ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์˜ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜๋œ ๋‚ ์งœ๋Š” ์›๋ž˜ dtstart ์™€ ์ผ์น˜ํ•˜์ง€๋งŒ between ์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ ํ˜„์žฌ ์‹œ๊ฐ„์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์•ฝ๊ฐ„์˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ, ruleset์€ ๋‚ด๊ฐ€ ์˜ˆ์ƒํ•œ ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ๋‚ ์งœ ๋ชฉ๋ก์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ 0๋ฒˆ์งธ ์š”์†Œ๋Š” ์›๋ž˜ ์›ํ•˜๋Š” ์ด๋ฒคํŠธ์˜ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ ์งœ์˜ ์‹œ๋ฆฌ์ฆˆ๋กœ ํ™•์žฅ๋˜๋Š” ํ˜„์žฌ์ž…๋‹ˆ๋‹ค. 1์›” 21์ผ์— ๋‚ ์งœ ๋ชฉ๋ก์„ ์–ป์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ์ง€๋งŒ ํ˜„์žฌ ์‹œ๊ฐ„(3์›” 22์ผ)์„ ์‚ฌ์šฉํ•˜์—ฌ rruleset์ด "๋ฐ˜๋ณต"๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

screen shot 2016-03-22 at 6 02 21 pm

๋‚˜๋Š” repo๋ฅผ ๊ฐ€์ ธ ์™€์„œ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋กœ ์ด๊ฒƒ์„ ์ขํžˆ๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์ง€๋งŒ ์กฐ์–ธ์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

dtstart์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. https://stackoverflow.com/questions/54517101/rrule-not-setting-correct-time-if-dtstart-is-set ์ฐธ์กฐ
์ƒ์„ฑ์ž์—์„œ dtstart๋ฅผ ์„ค์ •ํ•˜๋ฉด .all()์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •ํ™•ํ•œ ์‹œ๊ฐ„์„ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚˜์ค‘์— dtstart๋ฅผ ์„ค์ •ํ•˜๋ฉด ํ˜„์žฌ ์‹œ๊ฐ„์„ ์–ป์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ dtstart ๋Š” ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๊ณผ ๋” ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋™์ž‘์˜ ๋ฏธ๋ฌ˜ํ•จ์„ ๋ณด์—ฌ์ฃผ๋Š” ์ฝ”๋“œํŽœ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. https://codepen.io/arshaw/pen/qwEQNO?editors=0010

๊ธฐ๋ณธ์ ์œผ๋กœ dtstart ๋Š” ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๊ณผ ๋” ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋™์˜. ์ง€๊ธˆ rrule์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์„ธ์š”. ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(๊ณ ๋ง™์Šต๋‹ˆ๋‹ค!), ์ด ํฌ๊ด„์ ์ธ ๋‚ ์งœ๋Š” ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ์ž ์ •์˜ ๋…ผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์ƒํ•œ ๋‰˜์•™์Šค๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ์—…๋ฐ์ดํŠธ๋œ ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. python-dateutil๊ณผ ์ผ์น˜ํ•˜๋Š” ํ˜„์žฌ ๋™์ž‘์„ ์ดํ•ดํ–ˆ์ง€๋งŒ ์ด์ƒํ•œ ํŽธ์ฐจ๋ฅผ ์˜์†์‹œํ‚ค๋Š” ๊ฒƒ๋ณด๋‹ค RFC ํ‘œ์ค€๊ณผ ์ผ์น˜ํ•˜๋Š” ๋™์ž‘์— ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์•„๋ž˜ ์˜๊ฒฌ์— ๋”ฐ๋ผ:

RRuleSet์„ ์‚ฌ์šฉํ•˜๊ณ  dtstart๋ฅผ rdate๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ์›๋ž˜ ๋™์ž‘์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ, ์ด๊ฒƒ์€ ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ํ•„์š”ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์˜ ๋ณต์žก์„ฑ์„ ์ƒ๋‹นํžˆ ๊ณผ์†Œ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

new RRule({
  freq: RRule.WEEKLY,
  dtstart: new Date(Date.UTC(2020, 10, 1, 21, 0, 0)),
  count: 10,
  interval: 2,
  byweekday: RRule.MO
})

์ด๊ฒƒ์€ ์‹œ์ž‘ ๋‚ ์งœ๊ฐ€ 2020๋…„ 11์›” 1์ผ ์ผ์š”์ผ์ธ "๋งค 2์ฃผ๋งˆ๋‹ค ์›”์š”์ผ์— 10๋ฒˆ"์œผ๋กœ ๋ณ€ํ™˜ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค .

์ด์ œ ์‹œ์ž‘ ๋‚ ์งœ ์ดํ›„์˜ ์ฒซ ๋ฒˆ์งธ ๋‹ฌ๋ ฅ ์›”์š”์ผ์€ 11์›” 2์ผ์ž…๋‹ˆ๋‹ค... ๋”ฐ๋ผ์„œ ๊ฐ„๊ฒฉ์ด 2์ธ ๊ฒฝ์šฐ ์ƒ์„ฑ๋œ ์ด๋ฒคํŠธ ๋‚ ์งœ๋Š” 11์›” 2์ผ, 11์›” 16์ผ, 11์›” 30์ผ ๋“ฑ์ด ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ rrule ํŒจํ‚ค์ง€๋Š” ๋Œ€์‹  11์›” 9์ผ, 11์›” 23์ผ ๋“ฑ์˜ ๋‚ ์งœ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ „์ฒด ๊ฐ„๊ฒฉ์ด ์ž˜๋ชป๋˜์–ด ์ผ์ฃผ์ผ ์•ž์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์€ "RRuleSet์„ ์‚ฌ์šฉํ•˜๊ณ  dtstart๋ฅผ rdate๋กœ ์ถ”๊ฐ€"ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์œ ํ˜•์˜ ์ˆ˜์ • ์ž‘์—…์ด ํ›จ์”ฌ ๋” ๋งŽ์Šต๋‹ˆ๋‹ค.

image

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰