DTSTART ๋ฐ DTEND๋ iCalendar RRULE์ ์ผ๋ถ๊ฐ ์๋๋ฉฐ .toString()์ ์ํํ ๋ ํฌํจ๋์ด์๋ ์ ๋ฉ๋๋ค.
์ ํจํ iCalendar ๊ตฌ๋ฌธ์ด ๋ "DTSTART=x;DTEND=x;RRULE=x"์ ๊ฐ์ ๊ฒ์ ์์ฑํ ์ ์์ต๋๋ค.
๋ํ ํ๋ฌ์ค 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()
)์์ ๊ตฌํํ๋ ๊ฒ์ ์์ํ ์ ์์ผ๋ฉฐ ํ์์๋ ์ต์
์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ ๋ค๋ฅธ ์ฌ๋์ ์ํด ๋ด ํ์์ ๋ง๋ ๋์ฐ๋ฏธ ํจ์๋ฅผ ๋ง๋ค์์ต๋๋ค(์ฐธ๊ณ : typescript๋ก ์์ฑ๋จ)
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($ ;DTSTART=...;
Moment
๋ ์ง์ ํจ๊ป ์ฌ์ฉํ๋๋ก ์ค์ ํ์ง๋ง ์์ด๋์ด๋ ์ ์ ์์) RRuleSet. ๊ทธ๋ฐ ๋ค์ RuleSet์ ์์ ๋ถ๋ถ์ ์ฌ๋ฐ๋ฅธ ํ์์ 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 ์ ์กฐ์ธ ๋๋ถ์ ํธํ๋๋ rrule ๋ฌธ์์ด์ ์ป๋ ๊ฒ์ด ๊ทธ๋ฆฌ ์ด๋ ต์ง๋ ์์ง๋ง Python์ dateutil๋ก ํ๋ฌ๊ทธ ์ค ํ๋ ์ดํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๋์ํฉ๋๋ค. RFC์ Python์ ๊ตฌ๋ฌธ์๋ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํ ๋ฆฌํ์คํธ์ ๋งค์ฐ ๊ฐ๋ฐฉ์ ์ผ ๊ฒ์ ๋๋ค!
์ด์ TZID
๊ฐ ๊ตฌํ๋์์ผ๋ฏ๋ก(#261) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ ์ด์ ์ถ๋ ฅํ๋ ๋ฌธ์์ด์ ๊ตฌ๋ฌธ ๋ถ์ํ ์ ์์ต๋๋ค. 2.4.0 ์ด์ ์ถ๋ ฅ ๋ฌธ์์ด์ ๊ณ์ ๊ตฌ๋ฌธ ๋ถ์ํ์ง๋ง RFC ํธํ ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ฉด ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ์๋ฃจ์
์ ๋๋ฌํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
^ ์ฌ๊ธฐ์ ์๋ ๋ด ๋ง์ง๋ง ์ง์ ("๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ถ๋ ฅํ๋ ๋ฌธ์์ด์ ๋ ์ด์ ๊ตฌ๋ฌธ ๋ถ์ํ ์ ์์ต๋๋ค")์ด ์ด์ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ์ด๊ฒ์ #267์ ์ํด ์์ ๋์์ต๋๋ค. ๊ทธ๋๋ RFC๋ฅผ ์ค์ํ๋ ๊ฒ์ด ์ด์์ ์ ๋๋ค!
#269์ ์ํด ์์ ๋จ
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
:+1: ์ด ๋ฌธ์ ์ ๋ํด
AFAIK, DTSTART ๋
;
๋ก ๊ตฌ๋ถ๋๋ ๊ฒ์ด ์๋๋ผ ํญ์ ๋ค๋ฅธ ์ค์ด์ด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ #84์์ ์ฐธ์กฐํ ์์ ๊ฐ์ด(์ค ๋ฐ๊ฟ์ด ์ค์ํฉ๋๋ค):๋๋
;
์ ์ด ํ์ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ์ ํจํ RFC 5545๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค(๊ทธ๋ฌ๋ ์๋ชป๋ ๊ฒฝ์ฐ ์์ ์ ๊ธฐ๋ค๋ฆฝ๋๋ค).