λλ μ΄κ²μ΄ rruleμ λ¬Έμ κ° μλλΌ κ·Έκ²μ λν λμ μ΄ν΄ λ°/λλ μκ°λ μ§μμ λ¬Έμ κ° μλ€κ³ μκ°ν©λλ€. λλ μ΄λ―Έ rrule λ° luxon λ¬Έμμμ κ΄λ ¨ μΉμ μ μ½μμ΅λλ€.
const { RRule, RRuleSet } = require(`rrule`);
const dtstart = new Date();
console.log(`dtstart`, dtstart);
const firstHour = dtstart.getHours();
const secondHour = (firstHour + 2) % 24;
const getRRule = options => new RRule(Object.assign({}, options, {
freq: RRule.DAILY,
count: 1,
dtstart,
byminute: 0,
bysecond: 0
}));
const showNextInstance = tzid => {
const ruleSet = new RRuleSet();
ruleSet.rrule(getRRule({ tzid, byhour: firstHour }));
ruleSet.rrule(getRRule({ tzid, byhour: secondHour }));
console.log(tzid, ruleSet.after(dtstart));
};
showNextInstance(undefined);
showNextInstance(`UTC`);
showNextInstance(`local`);
showNextInstance(`America/Chicago`);
dtstart 2019-04-05T11:51:23.744Z
undefined 2019-04-06T06:00:00.744Z
UTC 2019-04-06T06:00:00.744Z
local 2019-04-06T06:00:00.744Z
America/Chicago 2019-04-06T06:00:00.744Z
tzid
μ μ¬μμ΄ μΆλ ₯μ μ½κ°μ μν₯μ μ€ κ²μ΄λΌκ³ μκ°νμ§λ§ κ° μκ°λμ λν΄ λμΌν μΆλ ₯μ΄ μμ±λ©λλ€.
λν κ·μΉμ μ 곡λ μκ°κ³Ό λ€μ μ΄λ²€νΈ μΈμ€ν΄μ€μ μΆλ ₯ μ¬μ΄μ μκ΄ κ΄κ³κ° 무μμΈμ§ μ μ μμ΅λλ€. λ€μ μΈμ€ν΄μ€λ μ§μ λ dtstart
λ° tzid
κ°μ΄ ν΄μλκ±°λ μ μ©λλ λ°©μμ λ°λΌ μ 곡λ κ·μΉμ΄ λνλ΄λ 2μκ° μ€ νλμ λλ΅ ν΄λΉν κ²μΌλ‘ μμν©λλ€.
2.6.0
OS X 10.14.2, λ Έλ 8.11.4
$ date
Fri Apr 5 06:32:33 CDT 2019
μ λ λ§μ΄ ν·κ°λ¦½λλ€.
μκ² μ΅λλ€. μ½μ΄λ³΄κΈ°μ λ€μκ³Ό κ°μ ν΅μ¬ λ¨λ½μ΄ μμμ΅λλ€.
νμ§ μκ°λμ μ΄ λ κ°μ§ λμ°λ―Έ κΈ°λ₯μ μ¬μ©ν΄μΌ ν©λλ€. tzidλ₯Ό μ§μνλλ‘ μ€νμ μ μμ νλ €λ©΄ X μκ°λμ λν μ€νμ μ κ°μ Έμ€λλ‘ μ€νμ μ μμ ν΄μΌ ν©λλ€.
/**
* Mutates date. Add timezone to the date.
*
* <strong i="9">@param</strong> {Date} [date]
*/
export function localizeDate(date = new Date()) {
const offset = new Date().getTimezoneOffset() * 60 * 1000; // get offset for local timezone (can modify here to support tzid)
date.setTime(date.getTime() - offset);
return date;
}
/**
* Mutates a date. De-timezones a date.
*
* <strong i="10">@param</strong> {Date} [date]
*/
export function utcifyDate(date = new Date()) {
const offset = new Date().getTimezoneOffset() * 60 * 1000; // get offset for local timezone (can modify here to support tzid)
date.setTime(date.getTime() + offset);
return date;
}
κ·Έλ¬λ©΄ μ½λκ° λ€μκ³Ό κ°μ΄ λ³κ²½λ©λλ€.
const { RRule, RRuleSet } = require(`rrule`);
const dtstart = localizeDate(new Date());
console.log(`dtstart`, utcifyDate(new Date(dtstart))); // even though it is utc string, this is the local time
const firstHour = dtstart.getUTCHours();
const secondHour = (firstHour + 2) % 24;
const getRRule = options => new RRule(Object.assign({}, options, {
freq: RRule.DAILY,
count: 1,
dtstart,
byminute: 0,
bysecond: 0
}));
const showNextInstance = tzid => {
const ruleSet = new RRuleSet();
ruleSet.rrule(getRRule({ byhour: firstHour })); // remove tzid as i dont support this
ruleSet.rrule(getRRule({ byhour: secondHour })); // removed tzid as i dont support this
console.log('local:', utcifyDate(ruleSet.after(dtstart));
};
showNextInstance(undefined);
showNextInstance(`UTC`);
showNextInstance(`local`);
showNextInstance(`America/Chicago`);
JSμ νΌλμ€λ½κ³ λΆκ·μΉν Date
ꡬνμ λ°λΌ ꡬμΆλ μ΄ λΌμ΄λΈλ¬λ¦¬μλ μ΄ λ¬Έμ λ₯Ό μ°ννλ μ’μ λ°©λ²μ΄ μμ κ² κ°μ΅λλ€. νμ¬ μμ ν μ¬μμ± μμ
μ νκ³ μμ§λ§ μ λλ‘ νλ €λ©΄ μκ°μ΄ μ’ κ±Έλ¦΄ κ²μ
λλ€.
κ°μ¬ν©λλ€ @davidgoli λΉμ μ μμ μ μ λ§ κ°μ¬ν©λλ€!!!
λ€λ₯Έ μ¬λλ€μ΄ λΆκ·μΉν λ μ§ κ΅¬νμ μ΄ν΄νλ λ° λμμ΄ λλ κΈ°μ¬λ₯Ό μμ±νλ €λ©΄ μ΄ν΄νλ μ¬λμ΄ νμνλ€κ³ μκ°ν©λλ€. μμ§ν μμ§λ μ΄ν΄κ° μ κ°λλ°, ν¨κ³Όκ° μμ λκΉμ§ μμ νμ΅λλ€.
μ½μμ μΈμνλ λ°νλ λ μ§λ λ¬Έμμ΄λ‘ λ³νλλ JavaScript λ μ§μ΄κ³ JavaScriptλ UTCλ‘ λ μ§λ₯Ό μ½μμ μλμΌλ‘ μΈμνκΈ° λλ¬ΈμΌ μ μμ΅λλ€(νμμ€ν¬ν λμ μλ 'Z' μ°Έμ‘° μ λ‘ μ€νμ ). λ€ κ°μ§ κ²½μ° κ°κ°μ λ€μ λ°μμ΄ μ νν κ°μ μκ°μ λ°μνκΈ° λλ¬Έμ(λ€λ₯Έ μκ°λμ μμμλ λΆκ΅¬νκ³ ) μ νν λμΌν νμμ€ν¬νλ₯Ό λ€ λ² μΈμν©λλ€.
λν JavaScript Date
κ°μ²΄λ 1970λ
1μ 1μΌ λͺ©μμΌ 00:00:00 UTC μ΄ν κ²½κ³Όλ λ°λ¦¬μ΄ μλ₯Ό μ¬μ©νμ¬ μκ°μ μΆμ ν©λλ€. "12:34:56pm"μ λν μΌμ’
μ λ¬Έμμ΄ ν΄μ λλ μ΄μ μ μ¬ν κ²μ
λλ€.
@davidgoli
νμ¬ μμ ν μ¬μμ± μμ μ νκ³ μμ§λ§ μ λλ‘ νλ €λ©΄ μκ°μ΄ μ’ κ±Έλ¦΄ κ²μ λλ€.
rScheduleμ μμ€ λ₯Ό νμΈνκ³ μΆμ μλ μμ΅λλ€. λͺ¨λ λ°λ³΅μ μ
λ ₯μ λ°μ μ
λ ₯κ³Ό λμΌνκ² λ³΄μ΄λ λΆλ utc λ μ§λ‘ λ³ννλ νΉμ DateTime
κ°μ²΄ (Luxonμ΄ μλ)λ‘ μνλ©λλ€. μ΄ UTC datetimeμΌλ‘ λ°λ³΅μ΄ μνλλ―λ‘ DSTλ λ¬Έμ κ° λμ§ μμ΅λλ€. λ°μμ΄ λ°κ²¬λ ν μ¬μ©μμκ² μ 곡λκΈ° μ μ ν΄λΉ μκ°λμ μ μ λ μ§λ‘ λ€μ λ³νλ©λλ€.
μ: μ΄ λ μ§
import { DateTime as LuxonDateTime } from 'luxon';
const date = LuxonDateTime.fromObject({
year: 2019,
month: 1,
day: 1,
zone: 'America/Los_Angeles'
})
μ΄ UTC λ μ§λ‘ λ³νλκ³ μκ°λκ° μ μ₯λ©λλ€.
const fakeDate = Date.UTC(2019, 0, 1)
const fakeDateZone = 'America/Los_Angeles'
μ΄ UTC λ μ§λ Luxon λ μ§μ μ μ¬νκ² λ³΄μ΄μ§λ§(λ λ€ 2019/1/1
μ²λΌ 보μ
λλ€) λ€λ₯Έ μκ°λμ μκΈ° λλ¬Έμ μ€μ λ‘ κ°μ μκ°μ λνλ΄μ§λ μμ΅λλ€.
μ¦, μ΄ νΉλ³ν "UTC" λ μ§λ‘ λ°λ³΅νλ©΄ μΌκ΄ μ μ½ μκ°μ λν΄ κ±±μ νμ§ μκ³ λ°λ³΅ν μ μμ΅λλ€. μ νν λ μ§λ₯Ό μ°ΎμΌλ©΄ luxon λ μ§λ‘ λ€μ λ³νν μ μμ΅λλ€.
μλ₯Ό λ€μ΄:
LuxonDateTime.fromObject({
year: fakeDate.year,
month: fakeDate.month,
day: fakeDate.day,
zone: fakeDateZone,
})
μ΄κ²μ μμμ μκ°λλ₯Ό κ³μ μ§μνλ©΄μ λ°λ³΅ λ‘μ§μ UTCμ μΉμνκ² μ μ§ν©λλ€.
@fliik λλ ν리미ν°λΈλ₯Ό λ€μ΄; μ¬κΈ°μμ μ§μ§ κ³¨μΉ«κ±°λ¦¬κ° λλ κ²μ λͺ μ£Όμ λλ€. rscheduleλ byweekno λ° bysetpos μ§μμ λν΄ (μ§κΈκΉμ§) μΈκΈνμ§λ§ ...
μ κ·Έλ. byweekno
μ(λ) λ§€μ° μ§μ¦λ©λλ€.
μ΄λ€ λ΄μ€?
Date
κ°μ²΄μ λ¬Έμ μ RRULE
λν λ°μ κ³μ° λ¬Έμ λ₯Ό λ³ν©νλ κ²μ΄ μ½λ€κ³ μκ°νλ―λ‘ μ΄ λμ κ²°ν©νκΈ° μ μ λ³λλ‘ μ΄μΌκΈ°νκ² μ΅λλ€. λλ λ¬Έμ μ λν λμ μ΄ν΄λ₯Ό μ 리νκ³ λ€λ₯Έ μ¬λλ€μκ² λμμ΄ λλ κ²½μ°λ₯Ό λλΉνμ¬ μ¬κΈ°μ κ²μν μκ°μ νκΈ° μν΄ μ΄κ²μ μ£Όλ‘ μμ±ν΄μΌ νμ΅λλ€.
λλ JS Date
κ°μ²΄κ° λΆκ·μΉνλ€λ λ° λμνμ§ μμ§λ§ κ·Έλ κ² λ³΄μ΄κ² λ§λλ κ°μ²΄μ λν μΌλ°μ μΈ μ€ν΄κ° μμ΅λλ€. νλ§λλ‘ νΌλμ€λ½μ΅λλ€.
@hlee5zebraκ° μΈκΈνλ―μ΄ Date
μμ±μλ‘ μμ±λ λ μ§λ νμ UTCλ‘ νμλ©λλ€. νμ§ μκ°μΌλ‘ νμλ μ μμ§λ§ μ€μ λ‘λ Unix Epoch μκ°μΌλ‘ νμλ©λλ€. μΈμ€ν΄μ€νλ Date
κ°μ²΄μμ νμ .getTime()
λλ .toISOString()
λ₯Ό μ€ννμ¬ UTCλ‘ μμ
νκ³ μμμ μ€μ€λ‘μκ² μκΈ°μν¬ μ μμ΅λλ€.
ꡬνμ λν λͺ¨λ μ²λ¦¬λ₯Ό UTCλ‘ μννκ³ μ¬μ©μμκ² νμλλ νμ§ μκ°μΌλ‘λ§ λ³ννλ κ·μΉμ μ¬λ°λ₯΄κ² λ°λ¦
λλ€. κ°λ°μμΈ μ°λ¦¬λ μ¬μ©μμ
λλ€. κ·Έλ¬λ μ°λ¦¬λ λ¬Όμ νλ¦¬κ² νλ μ°λ¦¬ μμ μ μ¬μ©μλ₯Ό μΌλμ λκ³ μμ΅λλ€. μ±μ κ°λ°ν λ κ·μΉμ λ°λΌμΌ νκ³ λ°±μλμμ λ μ§λ₯Ό UTCλ‘ μ μ₯ν΄μΌ ν©λλ€(JSλ μ΄λ―Έ UTCλ‘ λ μ§λ₯Ό μ²λ¦¬νλ―λ‘ μ μ¬μ©νκ³ μμ΅λλ€). λ°μ΄ν° μ μ₯μμ UTCλ‘ λ μ§λ₯Ό μ μ₯νλ©΄ ISO λ¬Έμμ΄ λ‘ ν΄λΌμ΄μΈνΈμ λμ°©νκ³ Date
κ°μ²΄μ μν΄ μ¬λ°λ₯΄κ² ꡬ문 λΆμλκ³ μ¬μ©μμ νμ§ μκ°μΌλ‘ νμλμ΄μΌ ν©λλ€.
μ΄ κΈμ ν΅ν΄ Date
κ°μ²΄λ₯Ό μ΄ν΄νκ³ κ°μ²΄λ‘ μΌλ§λ λ§μ μμ
μ μνν μ μλμ§ μ μ μμ΅λλ€. https://www.toptal.com/software/definitive-guide-to-datetime-manipulation
RRULE
λν λ°μ κ³μ°μ μ¬μ©μ κΈ°λμΉμ UTCλ‘ λ μ§ μ²λ¦¬μ κ·Όλ³Έμ μΈ μ°¨μ΄κ° μκΈ° λλ¬Έμ κΉλ€λ‘μμ§λλ€. μ΄ λ μκ° ννμ΄ ν루 μ₯λ²½μ λμ λ λμ λκ² λ©λλ€.
μλ₯Ό λ€μ΄, μ¬μ©μκ° λ§€μ£Ό νμμΌμ λ°μνλ λ°λ³΅μ μνλ©΄ λͺ¨λ λ°μμ΄ νμ§ μκ°μΌλ‘ νμμΌμ μμ κ²μΌλ‘ μμν κ²μ
λλ€. κ·Έλ¬λ λͺ¨λ κ³μ°μ UTCλ‘ μνλλ―λ‘ RRULE
λ λ€μκ³Ό κ°μ΅λλ€.
DTSTART:2019-10-29T00:02:26Z
RRULE:FREQ=WEEKLY;BYWEEKDAY=TU
UTCλ‘ νμμΌμ λ°μμ λ°ννμ§λ§ λ³Έμ΄ μμ€μ μμ μλΉν μμͺ½μ μλ μ¬μ©μμ κ²½μ° λ°μμ νμ§ μκ°μΌλ‘ μμμΌμ νμλλ©° μ΄λ λΆλͺ ν λꡬλ μνλ κ²°κ³Όκ° μλλλ€.
μ¦, κ°λ°μκ° μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ μνν΄μΌ νλ μΌμ JavaScriptκ° λ‘컬 λ μ§κ° μ€μ λ‘ UTC λ μ§λΌκ³ μκ°νλλ‘ κ°μ νκ³ ν΄λΉ "κ°μ§" λ μ§λ₯Ό rrule.js
μ μ§μ νκ³ λΌμ΄λΈλ¬λ¦¬μμ κ³μ°μ μννλλ‘ νλ κ²μ
λλ€. μ΄ νμ§ UTC μκ°. .all()
λ©μλμμ λ°μ νλͺ©μ κ°μ Έμ€λ©΄ ν΄λΉ λ μ§μ "UTC" λΆλΆμ μ¬μ©νμ¬ μ Date
κ°μ²΄λ₯Ό μΈμ€ν΄μ€νν©λλ€. μ΄λ κ²°κ³Όκ° μμκ³Ό ν¨κ³Όμ μΌλ‘ μΌμΉνλλ‘ ν©λλ€.
import { RRule } from 'rrule'
const dtstart = new Date('2019-10-29T00:02:26Z') // same as: `new Date(Date.UTC(2019, 9, 29, 0, 2, 26))`
console.log(dtstart.toISOString()) // 2019-10-29T00:02:26.000Z
console.log(dtstart) // Mon Oct 28 2019 17:02:26 GMT-0700 (Pacific Daylight Time)
const fakeDateStart = setPartsToUTCDate(dtstart)
console.log(fakeDateStart.toISOString()) // 2019-10-28T17:02:26.000Z
console.log(fakeDateStart) // Mon Oct 28 2019 10:02:26 GMT-0700 (Pacific Daylight Time)
const rule = new RRule({
freq: RRule.WEEKLY,
byweekday: [RRule.TU],
count: 2,
dtstart: fakeDateStart
})
const localUTCOccurrences = rule.all()
console.log(localUTCOccurrences.map(toISOString)) // ["2019-10-29T17:02:26.000Z", "2019-11-05T17:02:26.000Z"]
console.log(localUTCOccurrences) // [Tue Oct 29 2019 10:02:26 GMT-0700 (Pacific Daylight Time), Tue Nov 05 2019 09:02:26 GMT-0800 (Pacific Standard Time)]
const occurrences = localUTCOccurrences.map(setUTCPartsToDate)
console.log(occurrences.map(toISOString)) // ["2019-10-30T00:02:26.000Z", "2019-11-06T01:02:26.000Z"]
console.log(occurrences) // [Tue Oct 29 2019 17:02:26 GMT-0700 (Pacific Daylight Time), Tue Nov 05 2019 17:02:26 GMT-0800 (Pacific Standard Time)]
function setPartsToUTCDate(d) {
return new Date(
Date.UTC(
d.getFullYear(),
d.getMonth(),
d.getDate(),
d.getHours(),
d.getMinutes(),
d.getSeconds()
)
)
}
function setUTCPartsToDate(d) {
return new Date(
d.getUTCFullYear(),
d.getUTCMonth(),
d.getUTCDate(),
d.getUTCHours(),
d.getUTCMinutes(),
d.getUTCSeconds()
)
}
function toISOString(d) {
return d.toISOString()
}
https://codesandbox.io/s/rrule-localutc-conversion-zxlki
λλ κ°λ¨ν λ§ν΄μ:
import { RRule } from 'rrule'
const date = new Date('2019-10-29T00:02:26Z')
const rule = new RRule({
freq: RRule.WEEKLY,
byweekday: [RRule.TU],
count: 2,
dtstart: setPartsToUTCDate(date)
})
const occurrences = rule.all().map(setUTCPartsToDate)
https://codesandbox.io/s/rrule-localutc-conversion-in-short-ez7g0
λ΄κ° λ³Ό μ μλ ν Chrome, Firefox λ° Safariλ λͺ¨λ μ½μμ λ‘κ·ΈμΈν λ νμ§ μκ°μ λ¬Έμμ΄λ‘ λ μ§λ₯Ό νμνκ³ Node.jsλ UTCμ ISO λ¬Έμμ΄λ‘ νμν©λλ€.
@tim-phillips μ λ μ§κΈ μ΄ λ¬Έμ λ‘ κ³ ν΅λ°κ³ μμΌλ©° μ΄λ₯Ό ν΄κ²°νκΈ° μν μΌμ’ μ μμμ΄ ν¨μΉλ₯Ό μ°Ύκ³ μμ΅λλ€.
μ€ν 8μ(λλΆ νμ€μ)μ μ μλνλ λνμ΄ μ΄λ²€νΈκ° μμ§λ§ μ€ν 9μ(λλΆ νμ€μ)λ ν΄μΌ νλ μ λ λ‘ λ€μ λ―Έλ£¨κ³ μμ΅λλ€.
μ΄μ λν λ΅μ μ°Ύμ μ μμμ§ κΈ°λν΄ μ£ΌμΈμ.
@tim-phillips νλ₯ν κ³ μ₯μ λλ€. μμ§ μ§ν μ€μ΄μ§λ§ λ§μΉ¨λ΄ μ΄ν΄νλ λ° λμμ΄ λ κ² κ°μ΅λλ€. κ°μ¬ν©λλ€!
@tim-phillips λΆμν΄μ£Όμ μ κ°μ¬ν©λλ€.
κ·Έλ¬λ λ€μμ μ€λͺ ν μ μμ΅λκΉ? μ»΄ν¨ν°μ νμ§ μκ°λμ λ°λΌ μ루μ μ΄ μμμΌμ λ°νλ μ μλ κ² κ°μ΅λλ€.
@tonylau λ μ½μμμ νμΈ νμ§ μμΌλ©° νμ λ‘컬 μκ°λλ‘ λ³νλ©λλ€. getUTC*()
λ©μλλ₯Ό μ¬μ©νμ¬ λ μ§μ μΌλΆλ₯Ό κ°μ ΈμμΌ ν©λλ€. μ΄λ νμ§ μκ°λμ κ΄κ³μμ΄ λμΌν©λλ€.
@davidgoli
λ΄ μκ°λλ₯Ό UTC+14(Kiritimati Island/Line Islands Time)λ‘ μ€μ νκ³ getUTCDay()λ₯Ό μ¬μ©νλ κ²½μ°μλ λ€μμ μ»μμ΅λλ€. νμμΌμ΄μ΄μΌ ν λ μ§κ° μ¬μ ν μμμΌλ‘ λ°νλ©λκΉ?
μλλ°μ€: https://codesandbox.io/s/rrule-localutc-conversion-in-short-0uzt1
μ΄ ν λ‘ κ³Ό κ΄λ ¨μ΄ μμ μ μμ: https://github.com/tc39/proposal-temporal
@ννλ¦½μ€ κ°μ¬ν©λλ€!!!!!!!!! λ무 λμμ΄ λμμ΄μ!!!!!! λ£°λ‘ ics λ§λλ λ²μ μμλμ? λ Έλμμ ics ν¨ν€μ§λ₯Ό μ¬μ©ν λ μμΌ λ¬Έμ κ° λ€μ λ°μνκ³ μΊλ¦°λ μ΄λλ₯Ό λ°μΌλ©΄ ν΄λ¬΄μ λλ€. (νμ§λ§ λλ λΉμ μ μ½λ λλΆμ λ΄ dbμ λͺ¨λ κ²μ μ¬λ°λ₯΄κ² λ£μ μ μμ΅λλ€!! μ λ§ κ°μ¬ν©λλ€. )
κ°μ₯ μ μ©ν λκΈ
Date
κ°μ²΄μ λ¬Έμ μRRULE
λν λ°μ κ³μ° λ¬Έμ λ₯Ό λ³ν©νλ κ²μ΄ μ½λ€κ³ μκ°νλ―λ‘ μ΄ λμ κ²°ν©νκΈ° μ μ λ³λλ‘ μ΄μΌκΈ°νκ² μ΅λλ€. λλ λ¬Έμ μ λν λμ μ΄ν΄λ₯Ό μ 리νκ³ λ€λ₯Έ μ¬λλ€μκ² λμμ΄ λλ κ²½μ°λ₯Ό λλΉνμ¬ μ¬κΈ°μ κ²μν μκ°μ νκΈ° μν΄ μ΄κ²μ μ£Όλ‘ μμ±ν΄μΌ νμ΅λλ€.μλ°μ€ν¬λ¦½νΈ λ μ§ κ°μ²΄
λλ JS
Date
κ°μ²΄κ° λΆκ·μΉνλ€λ λ° λμνμ§ μμ§λ§ κ·Έλ κ² λ³΄μ΄κ² λ§λλ κ°μ²΄μ λν μΌλ°μ μΈ μ€ν΄κ° μμ΅λλ€. νλ§λλ‘ νΌλμ€λ½μ΅λλ€.@hlee5zebraκ° μΈκΈνλ―μ΄
Date
μμ±μλ‘ μμ±λ λ μ§λ νμ UTCλ‘ νμλ©λλ€. νμ§ μκ°μΌλ‘ νμλ μ μμ§λ§ μ€μ λ‘λ Unix Epoch μκ°μΌλ‘ νμλ©λλ€. μΈμ€ν΄μ€νλDate
κ°μ²΄μμ νμ.getTime()
λλ.toISOString()
λ₯Ό μ€ννμ¬ UTCλ‘ μμ νκ³ μμμ μ€μ€λ‘μκ² μκΈ°μν¬ μ μμ΅λλ€.ꡬνμ λν λͺ¨λ μ²λ¦¬λ₯Ό UTCλ‘ μννκ³ μ¬μ©μμκ² νμλλ νμ§ μκ°μΌλ‘λ§ λ³ννλ κ·μΉμ μ¬λ°λ₯΄κ² λ°λ¦ λλ€. κ°λ°μμΈ μ°λ¦¬λ μ¬μ©μμ λλ€. κ·Έλ¬λ μ°λ¦¬λ λ¬Όμ νλ¦¬κ² νλ μ°λ¦¬ μμ μ μ¬μ©μλ₯Ό μΌλμ λκ³ μμ΅λλ€. μ±μ κ°λ°ν λ κ·μΉμ λ°λΌμΌ νκ³ λ°±μλμμ λ μ§λ₯Ό UTCλ‘ μ μ₯ν΄μΌ ν©λλ€(JSλ μ΄λ―Έ UTCλ‘ λ μ§λ₯Ό μ²λ¦¬νλ―λ‘ μ μ¬μ©νκ³ μμ΅λλ€). λ°μ΄ν° μ μ₯μμ UTCλ‘ λ μ§λ₯Ό μ μ₯νλ©΄ ISO λ¬Έμμ΄ λ‘ ν΄λΌμ΄μΈνΈμ λμ°©νκ³
Date
κ°μ²΄μ μν΄ μ¬λ°λ₯΄κ² ꡬ문 λΆμλκ³ μ¬μ©μμ νμ§ μκ°μΌλ‘ νμλμ΄μΌ ν©λλ€.μ΄ κΈμ ν΅ν΄
Date
κ°μ²΄λ₯Ό μ΄ν΄νκ³ κ°μ²΄λ‘ μΌλ§λ λ§μ μμ μ μνν μ μλμ§ μ μ μμ΅λλ€. https://www.toptal.com/software/definitive-guide-to-datetime-manipulationκ·μΉ
RRULE
λν λ°μ κ³μ°μ μ¬μ©μ κΈ°λμΉμ UTCλ‘ λ μ§ μ²λ¦¬μ κ·Όλ³Έμ μΈ μ°¨μ΄κ° μκΈ° λλ¬Έμ κΉλ€λ‘μμ§λλ€. μ΄ λ μκ° ννμ΄ ν루 μ₯λ²½μ λμ λ λμ λκ² λ©λλ€.μλ₯Ό λ€μ΄, μ¬μ©μκ° λ§€μ£Ό νμμΌμ λ°μνλ λ°λ³΅μ μνλ©΄ λͺ¨λ λ°μμ΄ νμ§ μκ°μΌλ‘ νμμΌμ μμ κ²μΌλ‘ μμν κ²μ λλ€. κ·Έλ¬λ λͺ¨λ κ³μ°μ UTCλ‘ μνλλ―λ‘
RRULE
λ λ€μκ³Ό κ°μ΅λλ€.UTCλ‘ νμμΌμ λ°μμ λ°ννμ§λ§ λ³Έμ΄ μμ€μ μμ μλΉν μμͺ½μ μλ μ¬μ©μμ κ²½μ° λ°μμ νμ§ μκ°μΌλ‘ μμμΌμ νμλλ©° μ΄λ λΆλͺ ν λꡬλ μνλ κ²°κ³Όκ° μλλλ€.
λ°λ‘μ‘κΈ°
μ¦, κ°λ°μκ° μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ μνν΄μΌ νλ μΌμ JavaScriptκ° λ‘컬 λ μ§κ° μ€μ λ‘ UTC λ μ§λΌκ³ μκ°νλλ‘ κ°μ νκ³ ν΄λΉ "κ°μ§" λ μ§λ₯Ό
rrule.js
μ μ§μ νκ³ λΌμ΄λΈλ¬λ¦¬μμ κ³μ°μ μννλλ‘ νλ κ²μ λλ€. μ΄ νμ§ UTC μκ°..all()
λ©μλμμ λ°μ νλͺ©μ κ°μ Έμ€λ©΄ ν΄λΉ λ μ§μ "UTC" λΆλΆμ μ¬μ©νμ¬ μDate
κ°μ²΄λ₯Ό μΈμ€ν΄μ€νν©λλ€. μ΄λ κ²°κ³Όκ° μμκ³Ό ν¨κ³Όμ μΌλ‘ μΌμΉνλλ‘ ν©λλ€.https://codesandbox.io/s/rrule-localutc-conversion-zxlki
λλ κ°λ¨ν λ§ν΄μ:
https://codesandbox.io/s/rrule-localutc-conversion-in-short-ez7g0
λ΄κ° λ³Ό μ μλ ν Chrome, Firefox λ° Safariλ λͺ¨λ μ½μμ λ‘κ·ΈμΈν λ νμ§ μκ°μ λ¬Έμμ΄λ‘ λ μ§λ₯Ό νμνκ³ Node.jsλ UTCμ ISO λ¬Έμμ΄λ‘ νμν©λλ€.