ããã³ããšã³ãã§ã®ãã®ã©ã€ãã©ãªïŒv2.5.6ïŒã®åäœããããã¯ãšã³ãã§ã®åçã®PHPã©ã€ãã©ãªïŒv2.3.3ïŒãšæ¯èŒããŠããŸããã å€æéã®å€æŽã®åŠçæ¹æ³ã«ã¯æ確ãªççŸããããPHPããŒãžã§ã³ã®æ¹ãé©åã«åŠçã§ãããšæããŸãã
America/Denver
ã¿ã€ã ãŸãŒã³ã§ã¯ãå€æéã®åãæ¿ãã2018幎11æ4æ¥æ¥ææ¥ã«è¡ãããŸãïŒGMT-6ããGMT-7ã«ç§»è¡ïŒã ããã§ã¯ãååŸ1æã«å§ãŸããæéã®åãæ¿ãåã®11æ1æ¥ããæ¯é±æãæ°Žãæšã«ç¹°ãè¿ãããå®æçãªã·ãªãŒãºãèšå®ããŸãããã
RRule.fromString(
"DTSTART;TZID=America/Denver:20181101T190000;\n"
+ "RRULE:FREQ=WEEKLY;BYDAY=MO,WE,TH;INTERVAL=1;COUNT=7"
).all()
ãã®å Žåã以äžã®ããã«ããã¹ãŠã®åçºã¯ååŸ1æã«éå§ããããšãæåŸ ããŸãã ïŒããã¥ã¡ã³ãã«ãããšãç§ã¯Luxonã©ã€ãã©ãªã䜿çšããŠããŸããäœããã®æ¹æ³ã§åæåããå¿ èŠããããšããããšã¯äœã衚瀺ãããªãã£ãã®ã§ãyarnãä»ããŠæ£ãããã€ã³ã¹ããŒã«ããããŠãããšæããŸããïŒ
æåŸ ãããçµæïŒãã¹ãŠ13:00:00ããéå§ïŒïŒ
(7)Â [
Thu Nov 01 2018 13:00:00 GMT-0600 (Mountain Daylight Time),
Mon Nov 05 2018 13:00:00 GMT-0700 (Mountain Standard Time),
Wed Nov 07 2018 13:00:00 GMT-0700 (Mountain Standard Time),
Thu Nov 08 2018 13:00:00 GMT-0700 (Mountain Standard Time),
Mon Nov 12 2018 13:00:00 GMT-0700 (Mountain Standard Time),
Wed Nov 14 2018 13:00:00 GMT-0700 (Mountain Standard Time),
Thu Nov 15 2018 13:00:00 GMT-0700 (Mountain Standard Time)
]
å®çµæïŒ
(7)Â [
Thu Nov 01 2018 13:00:00 GMT-0600 (Mountain Daylight Time),
Mon Nov 05 2018 12:00:00 GMT-0700 (Mountain Standard Time), <-- Should be 13:00:00
Wed Nov 07 2018 12:00:00 GMT-0700 (Mountain Standard Time), <-- same
Thu Nov 08 2018 12:00:00 GMT-0700 (Mountain Standard Time), <-- same
Mon Nov 12 2018 12:00:00 GMT-0700 (Mountain Standard Time), <-- same
Wed Nov 14 2018 12:00:00 GMT-0700 (Mountain Standard Time), <-- same
Thu Nov 15 2018 12:00:00 GMT-0700 (Mountain Standard Time) <-- same
]
PHPã©ã€ãã©ãªã§åæ§ã®ç¶æ³ãèšå®ããå Žåãçµæã¯äžèšã®ãšããã§ããããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã¯UTCã§ã¯ãªãAmerica / Denverã¿ã€ã ãŸãŒã³ã®13:00:00ã«éå§ãããŸããã
ãã®ä»ã®æ å ±ïŒ
ç·šéïŒã¿ã€ããã¹ãä¿®æ£
ã³ã³ãœãŒã«ã®èŠåã衚瀺ãããŠããŸããïŒ äŸãã°ïŒ
'Using TZID without Luxon available is unsupported. Returned times are in UTC, not the requested time zone'
Luxonã¯optionalDependencies
ã«ããããã node_modules
ã«ããå Žåã¯ã€ã³ããŒããããŸãããããã§ãªãå Žåã¯ã€ã³ããŒããããŸãã
rruleãã¹ãã¹ã€ãŒãã§ã³ãŒããå®è¡ãããšã次ã®ããã«ãªããŸãã
[
[Date: 2018-11-01T19:00:00.000Z]
[Date: 2018-11-05T19:00:00.000Z]
[Date: 2018-11-07T19:00:00.000Z]
[Date: 2018-11-08T19:00:00.000Z]
[Date: 2018-11-12T19:00:00.000Z]
[Date: 2018-11-14T19:00:00.000Z]
[Date: 2018-11-15T19:00:00.000Z]
]
ããªããèŠæ±ããæéã¯ãã³ããŒã®ã¿ã€ã ãŸãŒã³ã§1900幎ãªã®ã§ãããã¯ç§ãæåŸ
ããŠããããšã§ãã ïŒããã¯JavaScriptã§ããPHPã§ã¯ãªããããããŒã«ã«ãã·ã³ã®ã¿ã€ã ãŸãŒã³ãŸãã¯UTC以å€ã®ã¿ã€ã ãŸãŒã³ã§Date
ãªããžã§ã¯ããæäŸããããšã¯ã§ããŸããããããã£ãŠãUTCã¯ãã®ã©ã€ãã©ãªãåžžã«äœ¿çšãããã®ã§ããïŒ
UTCã®æ¥ä»ã§ã¯ãªãããŒã«ã«ïŒMST / MDTïŒã®æ¥ä»ã衚瀺ãããŠãããšããäºå®ã¯ãç§ã«ã¯å°ãå°æããŠããŸãã ç§ã®ç¥ãéãããã®ã©ã€ãã©ãªã¯çŸåšãUTCæ¥ä»ã®ã¿ãè¿ãããã«æ§æãããŠããŸããã以åã¯ä»£ããã«ããŒã«ã«æ¥ä»ãè¿ããŠããŸããã
ã³ã³ãœãŒã«ã®èŠåã衚瀺ãããŠããŸããïŒ äŸãã°ïŒ
'Luxonã䜿çšããã«TZIDã䜿çšããããšã¯ãµããŒããããŠããŸããã è¿ãããæéã¯UTCã§ãããèŠæ±ãããã¿ã€ã ãŸãŒã³ã§ã¯ãããŸããã
ã³ã³ãœãŒã«ã®èŠåã¯ãããŸããã Luxonã¯é©åã«æäŸãããŠããããã§ãã
ã¿ã€ã ãŸãŒã³ã«é¢ããŠã¯ãChromedevtoolsã³ã³ãœãŒã«ã®ã³ãã³ãã©ã€ã³ã§ã³ãŒããçŽæ¥å®è¡ããçµæãšããŠMST / DSTãååŸãããŸãã
æé ïŒChromeãéã-> RRuleãšLuxonãæäŸãããŠããããŒãžã«ç§»å-> Cmd + Opt + I-> [ã³ã³ãœãŒã«]ã¿ã->äžã®ã¹ãããããã³ããŒããŠäžéšã®ã³ãã³ãã©ã€ã³ã«è²Œãä»ãã-> Enter
ãã®ã©ã€ãã©ãªã¯çŸåšãUTCæ¥ä»ã®ã¿ãè¿ãããã«æ§æãããŠããŸããã以åã¯ä»£ããã«ããŒã«ã«æ¥ä»ãè¿ãããã«äœ¿çšãããŠããŸããã
ãããã©ã®ããŒãžã§ã³ã§å€æŽããããç¥ã£ãŠããŸããïŒ ãªããã®å€æŽãè¡ãããã®ã§ããããïŒ UTCæ¥ä»ã®ã¿ãè¿ããšãå®éã«ã¯ãã®å€æéã®äžäžèŽãçºçããŸãã åžžã«13ïŒ00UTCã«çºçããã€ãã³ãã¯ãå€æéã®åãæ¿ãã®ååŸã®ç°ãªãæéã«ã€ãã³ããéå§ãããããšãã»ãŒä¿èšŒããŸãã ãã®å€æŽãå ã«æ»ãããå€æéãèæ ®ã§ããå¥ã®ä»£æ¿æ¹æ³ãæäŸããå¿ èŠããããšæããŸãã UTCã¯éåžžã«äŸ¿å©ã§ããããã¹ãŠã®ç¶æ³ã§åžžã«æ£ããã¢ãããŒãã§ãããšã¯éããŸããã å®æçãªã€ãã³ããåŠçããå Žåãç¹ã«å€æéãéèŠã§ãããããã€ãã³ããçºçããç¹å®ã®ã¿ã€ã ãŸãŒã³ãèæ ®ããå¿ èŠããããŸãã
å®éãChromeã®åäœã¯Nodeã®åäœãšã¯ç°ãªããŸãã
ç§ã¯ããªãã®äžãããããæåŸ ããããåºåãããªããæ¬åœã«æåŸ ããŠãããã®ã§ããçç±ãç解ããŠããªããšæããŸãã ãããã®æéã¯æ£ãããªãããã«èŠããŸãã
æ£ããã®ã¯ãæå®ãããçŸå°æéã«åæéã®TZãªãã»ãããè¿œå ããå Žåã®æéã§ãã ãã®åŸããã¹ãŠã®æéã¯19:00ã«ãªããŸãã ããããRRuleãUTCãæ±ãçç±ã§ãããUTCã®äœ¿çšããã®ç¹å®ã®ãã°ãšã¯äœã®é¢ä¿ããªãçç±ã§ãã
確ãã«ãããªãããããããªãã°ïŒ
const dates = RRule.fromString(
"DTSTART;TZID=America/Denver:20181101T190000;\n"
+ "RRULE:FREQ=WEEKLY;BYDAY=MO,WE,TH;INTERVAL=1;COUNT=7"
).all()
dates.map((date) => date.toISOString())
äžè²«ããŠæ£ããæ¥ä»ãšæå»ã§çµæã®ISOæååã衚瀺ãããŸãã
ããã«ãChromeã¯UTCã§ã®æ¥ä»ã®è¿éããŸã£ãããµããŒãããŠããªãããã§ãã
> new Date(Date.UTC(2016, 10, 5))
Fri Nov 04 2016 17:00:00 GMT-0700 (Pacific Daylight Time)
// ^ I asked for a date in UTC, not in PDT!
RRuleã¯ãLuxonã䜿çšããŠãããŒã«ã«ã¿ã€ã ãŸãŒã³ã ãã§ãªãã_äžçã®ãã¹ãŠã®ã¿ã€ã ãŸãŒã³_ã®æ£ããçŸå°æéãçæããŸãã ãããUTCã®äœ¿çšãéèŠã§ããçç±ã§ããã¿ã€ã ãŸãŒã³ã³ãŒããããŒã«ã«ã¿ã€ã ãŸãŒã³ã®ãæ£ãããæ¥ä»ãè¿ããããå¥ã®ã¿ã€ã ãŸãŒã³ã§æ¥ä»ãçæããå¿
èŠãããå ŽåïŒ TZID
ãã©ã¡ãŒã¿ãæå®ïŒã次ã®ããã«ãªããŸããéåžžã«äžæ£ç¢ºãªçµæã ãUTCæ¥ä»ãã䜿çšããŠããã®ã¯ãUTCã§DSTèšç®ãè¡ã£ãŠããããã§ã¯ãªãïŒãã¹ãã¹ã€ãŒãã調ã¹ãŠãæ£ããDSTèšç®ã®äŸãããããèŠãããšãã§ããŸãïŒãJavaScriptä»æ§ã®ã¿ã€ã ãŸãŒã³ãã²ã©ãããã§ããå£ããŠãããUTCã¯å©çšå¯èœãªããã¥ãŒãã©ã«ããªæ¥ä»ã®æŠå¿µã«æãè¿ããã®ã§ãã äœæ¥ãæ··ä¹±ãããã®ã©ã€ãã©ãªã®äœ¿çšæ³ããã以äžæ確ã«ã§ããªãããšããè©«ã³ç³ãäžããŸãïŒãã ããææ¡ã¯åãä»ããŠããŸãïŒã
æžå¿µããŠããã®ã¯ãããªããæèµ·ãããã©ãŠã¶ã®äºææ§ã®åé¡ã§ãã å®è¡äžã®Nodeã³ã³ãœãŒã«ããŸãã¯Firefoxã§ç¬èªã®ãµã³ãã«ã³ãŒããè©ŠããŠã¿ãŠãã ããã éåžžã«ç°ãªãïŒãããŠæ£ããïŒçµæã衚瀺ãããŸãã
ãããã£ãŠãããã§ã®æ¬åœã®åé¡ã¯ãçµæãChromeã§æ··ä¹±ããããšã§ãã 察åŠãã䟡å€ããããšæããŸããããã®æ¹æ³ã¯ããã«ã¯ããããŸããã ç§ãããªãã«èšãããšãã§ããã®ã¯ãäž¡æ¹ã®ç°å¢ããŸã£ããåãISOæååãšã¿ã€ã ã¹ã¿ã³ããçæãããšããããšã§ãã
@davidgoliããã§ããFirefoxã¯ãå
ã®ã³ãŒããå®è¡ãããšãã³ã³ãœãŒã«ã«ç°ãªãçµæã衚瀺ããŸãã ãã ããçµæã¯æçµçã«åãæéã«ãªããŸããFirefoxã§ã¯çµæãUTCæéã§è¡šãããã®ã«å¯ŸããChromeã§ã¯America/Denver
æéïŒãŸãã¯ããããããŒã«ã«ã¿ã€ã ãŸãŒã³ïŒã§è¡šãããŸãã
ç§ã¯ããªãã®äžãããããæåŸ ããããåºåãããªããæ¬åœã«æåŸ ããŠãããã®ã§ããçç±ãç解ããŠããªããšæããŸãã ãããã®æéã¯æ£ãããªãããã«èŠããŸãã
æ£ããã®ã¯ãæå®ãããçŸå°æéã«åæéã®TZãªãã»ãããè¿œå ããå Žåã®æéã§ãã ãã®åŸããã¹ãŠã®æéã¯19:00ã«ãªããŸãã ããããRRuleãUTCãæ±ãçç±ã§ãããUTCã®äœ¿çšããã®ç¹å®ã®ãã°ãšã¯äœã®é¢ä¿ããªãçç±ã§ãã
å®æçãªã€ãã³ãããšã«19ïŒ00UTCã®æéãå¿ èŠãªãçç±ã説æããããšæããŸãã
ãŠãŒã¶ãŒãæ¯é±æ°Žææ¥ã®ååŸ1æã«America/Denver
ã¿ã€ã ãŸãŒã³ã®ç¹å®ã®å Žæã§ç¹°ãè¿ãã€ãã³ããã¹ã±ãžã¥ãŒã«ããããšããŸãã ç°¡åã«èšããšãããã¯ã1幎ã®ã©ã®ææã§ãã£ãŠãããã®å Žæã§æ°Žææ¥ã®ååŸ1æã«ãªããšãæ¯é±æ°Žææ¥ã®ååŸ1æã«åãã€ãã³ããçºçããããšãæåŸ
ããŠããããšãæå³ããŸãã ååŸ12æã§ã¯ãªããååŸ2æã§ã¯ãããŸããã ã¢ã¡ãªã«/ãã³ããŒæéã¯åžžã«ååŸ1æã
ãã ããrruleã¯ãã¿ã€ã ãŸãŒã³ãæž¡ãããå Žåã§ããUTCæéã«åŸã£ãŠåçºã解決ããŠããŸããããã«ãããåºæ¬çã«ãããããååŸ1æã®ã¢ã¡ãªã«/ãã³ããŒã¯19:00ãšè©äŸ¡ãããŸãããããã£ãŠã19ïŒ00ã¢ã¡ãªã«/ãã³ããŒã§ã¯ãäžå¹Žäžåžžã«ååŸ1æãåç §ããå¿ èŠããããŸãã ãããããããã¯çå®ã§ã¯ãããŸããã 2018幎11æ4æ¥ããåã¯ããã§ããã11æ4æ¥ä»¥éãã¢ã¡ãªã«/ãã³ããŒã¯å€æéãå»æ¢ããŸãããã®æç¹ã§ã UTCæé19:00ã¯ã¢ã¡ãªã«/ãã³ããŒæéã®ååŸ12:00ã«è©äŸ¡ãããŸãã ãã®ããããŠãŒã¶ãŒã«ã¯ãã€ãã³ããååŸ1æã§ã¯ãªãååŸ12æã«çºçããŠãããšèª€ã£ãŠéç¥ãããŸãã
èšãæãããšãååŸ1æã®ã¢ã¡ãªã«/ãã³ããŒã¯å€æéã§ãããã©ããã«å¿ããŠ19:00ãŸãã¯20:00 UTCã®ããããã«ãªãã19ïŒãšèšãããã®ã§ãrruleã䜿çšããŠæ£ããåçºãååŸããããšã¯ã§ããŸããã 00ã¯äžå¹Žäžæ£ããæéã§ãã
rruleã¯ãã»ãšãã©ã®ããã°ã©ããŒãä¿¡ããŠããç¥è©±ã«è³åããŠããããã«æããŸããã€ãŸããUTCã¯ãæ¥ä»ãšæå»ãåŠçãããšãã«åžžã«æ£ãããœãªã¥ãŒã·ã§ã³ã§ãããšããããšã§ãã ãã ãããããæåã®è§£æ±ºçã§ã¯ãªãç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ãããããã®ã€ã³ã¹ã¿ã³ã¹ïŒç¹å®ã®å Žæã§å°æ¥ã®ã€ãã³ããç¹°ãè¿ãïŒã¯ãã®1ã€ã§ãã
ç·šéïŒçè«çã«ã¯ãrruleãUTCã§æå»ãè¿ãããšã¯åé¡ãããŸããããã¿ã€ã ãŸãŒã³ãæž¡ããããšããããã®æå»ã¯ç¹å®ã®ã¿ã€ã ãŸãŒã³ã«å¯ŸããŠæ£ããã¯ãã§ããã€ãŸãã19ïŒ00UTCãã20ïŒ00UTCã«åãæ¿ããã¯ãã§ããããã§èª¬æããŠããäŸã®å Žåãçµæã»ããã®ããã€ãã®ãã€ã³ãã
Lemmeã¯ããã«æ»ã£ãŠããŸã-ããã¯ããã¥ã¡ã³ãã®åé¡ã ãšæããŸãã
RRule_always_ã¯JSãUTCãã®æ¥ä»ãè¿ããŸãã ãã ããããã¯ããããã®æ¥ä»ãUTCæå»ãè¡šãããšãæå³ããŠããããšãæå³ãããã®ã§ã¯ãããŸããã ããããå¯äžã®éžæè¢ã§ããããŒã«ã«æ¥ä»ã®å¶éã«ããããã®ã©ã€ãã©ãªãå®è¡ããŠããæ¥ä»èšç®ã«ã¯ãã¿ã€ã ãŸãŒã³ãªãã»ããã0ã®JSæ¥ä»ã®ã¿ã䜿çšã§ãããšãã決å®ãäžãããŸããã ããã«ã¯èª€è§£ãæãå¯äœçšãããããããã®æéã¯å®éã«ã¯UTCã§ã®æéãè¡šããŠããããã«èŠããŸãããå®éã«ã¯TZID
ãã©ã¡ãŒã¿ã§è¡šãããã¿ã€ã ãŸãŒã³ã§è§£éãããããšãæå³ããŠããŸãã ãããã£ãŠãããšãã°Firefoxã§ã¯ãæå³ãããåäœã¯ãã©ã€ãã©ãªã19:00ãè¡šãæ¥ä»ãè¿ãããšã§ããããã®æå»ããã³ããŒæå»ã«ããããã«èŠæ±ããããããã³ããŒæå»ã«å¯ŸããŠæ£ãããã®ã«ãªããŸãã ãã®æ¥ä»ãUTCæ¥ä»ã§ãããšå ±åããŠãããšããäºå®ãç¡èŠããããšãæå³ããŸããããã¯ãJavaScriptã§åœ¹ç«ã€å¯äžã®çš®é¡ã®æ¥ä»ã ããã§ãã 代ããã«ããã®ã«ãŒã«ã«ã¯ãã³ããŒã®ã¿ã€ã ãŸãŒã³ããããšããç¥èã䜿çšããŠã19ïŒ00ããã³ããŒã®çŸå°æéãšããŠè§£éããããšãç®çãšããŠããŸãã
ããã¯ãããŒã«ã«ãã·ã³ã®ãŸãŒã³å€ã®ã¿ã€ã ãŸãŒã³ã䜿çšããŠããå Žåã«æ確ã«ãªããŸãã ããšãã°ã代ããã«ãŸãŒã³åAmerica/New_York
ã§RRuleãèšå®ããå Žåãæ¥ä»ã¯17:00ãšããŠè¿ãããŸããããã¯ããã·ã³ã®ã¿ã€ã ãŸãŒã³ïŒãã³ããŒïŒã19ã®å Žåã®çŸå°æéã§ããããã§ããèŠæ±ãããã¿ã€ã ãŸãŒã³ïŒãã¥ãŒãšãŒã¯ïŒã§ïŒ00ã
JavaScriptã«ã¯æ¥ä»ãç¹å®ã®ã¿ã€ã ãŸãŒã³ã«ãåºå®ãããæ¹æ³ããªããããäœããã£ãŠãåžžã«æ£ããæ¥ä»ãšæå»ãè¡šããæ¥ä»ãUTCãšããŠå ±åãããšããäºå®ãç Žæ£ã§ããŸãã ã¿ã€ã ãŸãŒã³ãRRuleã§äœ¿çšãããå Žåãããã¯å®éã«ã¯çŸå°æéã§ãã ããããFirefoxãæ£ããçŸå°æéã19:00ãšããŠæäŸããçç±ã§ãïŒãã®æ¥ä»ã¯UTCãšããŠå ±åãããŸãããå®éã«ã¯ãã³ããŒæéã§ãïŒã
ããã¯ç©äºãæ確ã«ããŸããïŒ çŽãããããçŽæçã§ã¯ãªãããšã¯ç解ããŠããŸãããç解ããã°ç°¡åã«æšè«ã§ããããã«ãªãããšãç解ããã®ã«ååç°¡åãªããšãé¡ã£ãŠããŸãã ç§ãã¡ã¯ééããªããããããããææžåããå¿ èŠããããŸãã
ããããæ¢æ±ãããããšã®1ã€ã¯ãLuxonã䜿çšããŠãçµæã®æ¥ä»ãããŒã«ã«ã¿ã€ã ãŸãŒã³ã«åãŸãŒã³åããå¯èœæ§ããããããå°ãªããšãæåŸ ãšäžèŽããŠããããšã§ãã ããã¯ããã»ã©é£ããããšã§ã¯ãªãããã®ãããªèª€è§£ãæããã«ããã®ã«åœ¹ç«ã€ã¯ãã ãšæããŸãã Chromeã®åé¡ã¯ç§ã«ãšã£ãŠãŸã£ããæ°ãããã®ã§ãããæªããã¥ãŒã¹ã§ãã
ãã ããããã¯é倧ãªå€æŽãšãªããããåºè·åã«ã³ãã¥ããã£ããã®ãã£ãŒãããã¯ã®æ©äŒãæäŸããããšæããŸãã
@shorlbeckãã®å·®åã¯ãæåŸ ããåäœãå®è£ ããŠãããšæããŸãã
diff --git a/src/datewithzone.ts b/src/datewithzone.ts
index 8ae3ed0..d9b917c 100644
--- a/src/datewithzone.ts
+++ b/src/datewithzone.ts
@@ -38,7 +38,10 @@ export class DateWithZone {
const rezoned = datetime.setZone(this.tzid!, { keepLocalTime: true })
- return rezoned.toJSDate()
+ return rezoned
+ .toUTC()
+ .setZone('local', { keepLocalTime: true })
+ .toJSDate()
} catch (e) {
if (e instanceof TypeError) {
console.error('Using TZID without Luxon available is unsupported. Returned times are in UTC, not the requested time zone')
diff --git a/test/rrule.test.ts b/test/rrule.test.ts
index 7774b8a..a794e02 100644
--- a/test/rrule.test.ts
+++ b/test/rrule.test.ts
@@ -3804,4 +3804,17 @@ describe('RRule', function () {
expect(() => rule.between(invalidDate, validDate)).to.throw('Invalid date passed in to RRule.between')
expect(() => rule.between(validDate, invalidDate)).to.throw('Invalid date passed in to RRule.between')
})
+
+ it('#300', () => {
+ const rule = RRule.fromString(
+ "DTSTART;TZID=America/Denver:20181101T190000;\n"
+ + "RRULE:FREQ=WEEKLY;BYDAY=MO,WE,TH;INTERVAL=1;COUNT=3"
+ )
+
+ expect(rule.all()).to.deep.equal([
+ DateTime.utc(2018, 11, 2, 1, 0, 0).toJSDate(),
+ DateTime.utc(2018, 11, 6, 2, 0, 0).toJSDate(),
+ DateTime.utc(2018, 11, 8, 2, 0, 0).toJSDate(),
+ ])
+ })
})
ããããç§ã¯ããããã®ã©ã€ãã©ãªã«è¡ãæ¹æ³ã§ãããšå®å
šã«ç¢ºä¿¡ããŠããããã§ã¯ãããŸããã ã¯ã©ã€ã¢ã³ãã®ããŒã«ã«ã¿ã€ã ãŸãŒã³ã§è§£éãããããšãåžžã«æå³ããããããŒãã£ã³ã°ãæéãè¿ããšããã©ã€ãã©ãªã®äžè¬çãªã¢ãããŒããèãããšïŒãªãã»ããã¯0ã§ããïŒã rrule
ã«ãã£ãŠè¿ãããæ¥ä»ã«é©åãªã²ãã¿ãŒã¯getUTC*
ã²ãã¿ãŒã§ãããããã£ãŠãããšãã°ãå
ã®çµæã®åæ¥ä»ã«getUTCHours()
ã䜿çšãããšã次ã®ããã«ãªããŸãã Chromeã§ãæ£ããæéã
ããã§ã®æ£ããä¿®æ£ã¯ããã®ã©ã€ãã©ãªã®åäœãå€æŽããããšã§ã¯ãªããç䌌ãUTCãïŒå®éã«ã¯ããããŒãã£ã³ã°ãïŒã®ããç¹ç°ãªäœ¿çšæ³ãããæ確ã«ææžåããããšã§ãããšç§ã¯èããŠããŸãã ããããç§ã¯ããã«ã€ããŠèª¬åŸããããšã¯ã§ããŸãã
ãŠãŒã¹ã±ãŒã¹ã®èª¬æãšæé ãå«ãREADMEãæŽæ°ããŸããã ãã ãããã®è°è«ãç¶ããããšã«èå³ããããã©ã€ãã©ãªã®å°æ¥ã®ããŒãžã§ã³ã§ãã®åäœãå€æŽããå¯èœæ§ããããŸãã
è¿ä¿¡ãšè©³ãã説æããããšãããããŸãã
æ®å¿µãªãããç§ã¯ãã以äžæ··ä¹±ããããšã¯ãããŸããã
æ¥ä»ãšæå»ã®æäœã¯ããããã®æ¥æãå®éã«UTCãŸãã¯å®éã«çŸå°æéã§ããå Žåã¯ååã«å°é£ã§ãããUTCæå»ãå®éã«ã¯UTCæå»ã§ã¯ãªãå ŽåãããããšãèŠããŠããå¿ èŠããããŸãã ä»æ¥ã¯ããªããæžãããã®ãç解ããããšäžæ¥äžéãããŸããããçµå±ã®ãšãããããã¯å®å šã«çŽæã«åããŠããã®ã§ãç§ã¯ããã«ã€ããŠé ãæ©ãŸããããšãã§ããŸããã
ã³ãŒããèŠãŠãUTCãã®æ¥ä»ã衚瀺ããããšããããå®éã«UTCãªã®ããç䌌UTCãªã®ããç¹ã«Chromeã®åé¡ãè¿œå ããå Žåã¯æãåºããŸããã ããã¯ç§ãã³ãŒãã£ã³ã°ããããšãã»ãšãã©äžå¯èœã«ããŠããã ããã¯ç§ã®ã³ãŒãã®å¯èªæ§ã«å¯Ÿããç§ã®ä¿¡é Œãå°ç¡ãã«ããŠããŸãã
ãããç§ã®è³ªåã§ã...å
ã®äŸã«æ»ããŸã...æ¬åœã®UTCã§ã¯ã 2018-11-01 19:00:00
ã¯ã¢ã¡ãªã«/ãã³ããŒæéã®ååŸ1æïŒ13:00ïŒãæããŸãã ãããŠç§ã®äŸã§ã¯ãååŸ1æã®ã¢ã¡ãªã«/ãã³ããŒãç§ã®ã€ãã³ãã®æ£ããæéã§ãã ããããUTCãçã®UTCã§ãªãå Žåã tzid
ãã©ã¡ãŒã¿ãŒã䜿çšãããšãã«new Date(Date.UTC(2018, 10, 1, 13, 0, 0))
ãŸãã¯new Date(Date.UTC(2018, 10, 1, 19, 0, 0))
ãæž¡ãå¿
èŠããããšããããšã§ããïŒ ïŒéãã¯13:00ãš19:00ã§ãïŒ
ç䌌UTCãåºãŠè¡ãã ãã§ãªãå ¥ã£ãŠããã®ã§ããïŒ ãŸãã¯ãçã®UTCã¯å ¥ããŸãããç䌌UTCã¯åºãŸããïŒ ãããŠãã©ãããã°ããã確å®ã«èŠããããšãã§ããŸããïŒ
rruleã¯æ¬¡ã®ããã«æå®ãããŸãã
DTSTART;TZID=America/Denver:20181101T190000
RRULE:FREQ=WEEKLY;BYDAY=MO,WE,TH;INTERVAL=1;COUNT=7
ãã ããRRULE RFC5545ã«ãããšãããã¯ãçŸå°æéã1900ã§ãããã³ããŒã¿ã€ã ãŸãŒã³ã®ã«ãŒã«ã瀺ããŠããŸããhttps ïŒ//tools.ietf.org/html/rfc5545#section -3.3.5
For example, the following represents 2:00 A.M. in New York on January 19, 1998:
TZID=America/New_York:19980119T020000
ãã³ããŒã®çŸå°æé1300ã§DTSTARTãå¿ èŠãªå Žåã¯ãã«ãŒã«ã§1300ãšããŠæå®ããå¿ èŠããããŸãã ã©ã€ãã©ãªã¯ããã®ç¹ã§ä»æ§ã«å®å šã«æºæ ããŠããå¿ èŠããããŸãã ïŒãŸããããã1300 UTCãè¿ããšãããã€ããŒãªäºå®ãé€ããŠ...ïŒ
ããã«ãããããŒãã£ã³ã°æéãã®ã»ã¯ã·ã§ã³ãå¿ ããèªã¿ãã ããã
FORM #1: DATE WITH LOCAL TIME
The date with local time form is simply a DATE-TIME value that
does not contain the UTC designator nor does it reference a time
zone. For example, the following represents January 18, 1998, at
11 PM:
19980118T230000
DATE-TIME values of this type are said to be "floating" and are
not bound to any time zone in particular. They are used to
represent the same hour, minute, and second value regardless of
which time zone is currently being observed. For example, an
event can be defined that indicates that an individual will be
busy from 11:00 AM to 1:00 PM every day, no matter which time zone
the person is in. In these cases, a local time can be specified.
æ®å¿µãªãããJavaScriptã¯ãæµ®åæéãã®å®è£
ãæäŸããŠããŸããã ãçŽç²ãªãã¿ã€ã ãŸãŒã³ã®ãªãæéã«æãè¿ããªãã·ã§ã³ã¯UTCãã€ãŸããpsuedo-UTCãã§ãã ïŒèšé²ãšããŠã rrule
ã¯æµ®åæéããµããŒãããŠãããTZIDã§ãZ
UTCæå®åã§ãæå®ãããŠããŸãããïŒ
UTCãžã®åãæ¿ãã¯ããã®ã³ãããã§å®å šã«éå§ãããŸããïŒ https ïŒ//github.com/jakubroztocil/rrule/commit/850ed075175eb1acfcbd7b2cddf0606f2b2206f7
åã®ã³ãããããã§ãã¯ã¢ãŠãããïŒ850ed075ããè¿œå ããããã¹ããéžæãããšã倱æããããšãããããŸãã å®éãã¹ã€ãŒãå
šäœãUTCã§å®è¡ãããªãéããäœçŸãã®ãã¹ãã倱æããŠããŸããã ããã¯ãDSTã®å¢çãè¶ããå°æ¥ã®æ¥ä»ãèšç®ããããã«ãçŸåšã®æèšãDSTã§å®è¡ãããŠããæ¥ä»ãã€ã³ã¹ã¿ã³ã¹åããŠãããæšæºæéã«å
¥ãèšç®ãèšç®ããå¿
èŠãããã1æéã®ãªãã»ãããæ£ãããªãããã§ãã çŸåšã®å®è£
ã§ã¯ãåžžã«æ£ããçŸå°æéãåŸãããŸãã ããã§ããã¹ãã¹ã€ãŒãå
šäœãå®éã«ã¯ã©ã®ããŒã«ã«ç°å¢ã§ãåæ ŒããŸãããæ£ããæ¥ä»/æéãååŸããã«ã¯ã getUTCDate()
/ getUTCHour()
ã¡ãœããã䜿çšããå¿
èŠãããããšã«æ³šæããŠãã ããã
å°æ¥ã®ããŒãžã§ã³ã§ãããå€æŽããããšãæ€èšããŠããŸãããLuxonã®ãããªå¿ é ã®ãµãŒãããŒãã£ã©ã€ãã©ãªãæ¡çšããªãéããå€æŽã¯ç°¡åã§ã¯ãããŸããã
ä»åŸã®ããŒãžã§ã³ã§ã¯ãåäœãå€æŽããŠãããŒã«ã«ã¿ã€ã ãŸãŒã³ã§åžžã«æ£ããæ¥ä»ãè¿ãããã«ããããšæããŸããããšãã°ã次ã®ããã«ãªããŸãã
DTSTART;TZID=America/Denver:20181101T130000
ã¯ããã³ããŒã«ããå Žåã¯1300-0700
ïŒæšæºæïŒãUTCã«ããå Žåã¯2000Z
ã®æ¥ä»ãè¿ããŸããDTSTART=20181101T130000
ã¯ããã³ããŒã«ããå Žåã¯1300-0700
ã«ãªããUTCã«ããå Žåã¯1300Z
ã«ãªããŸããDTSTART=20181101T130000Z
ã¯ããã³ããŒã«ããå Žåã¯0600-0700
ã«ãªããUTCã«ããå Žåã¯1300Z
ã«ãªããŸããããã¯ããªããæåŸ ããŠããæ¯ãèãã§ããïŒ
倧ããªåé¡ã®1ã€ã¯ãç¹å®ã®ããŒã«ã«JSç°å¢ãåäžã®ã¿ã€ã ãŸãŒã³ã®æ¥ä»ããè¡šçŸã§ããªãããšã§ãã ãããã£ãŠãç¹å®ã®ã¿ã€ã ãŸãŒã³ïŒçŸåšã®ã¿ã€ã ãŸãŒã³ãšã¯ç°ãªãå ŽåããããŸãïŒã®æ¥æãè¡šãå Žåã¯ã new Date(...)
ãnew Date(Date.UTC(...))
ãé©åã§ã¯ãããŸããã
ã§ã¯ã次ã®ãããªåäœãæ³å®ãããŠããŸãã
new RRule({
dtstart: new Date(2018, 10, 1, 10, 0, 0),
tzid: 'America/Denver'
})
ããŒã«ã«ãã·ã³ãAmerica/Los_Angeles
ã«ããå Žåã¯ïŒ äœæããŠããæéãšãã®æéãåžæããã¿ã€ã ãŸãŒã³ãšã®1æéã®éããå°ãªããšãããçšåºŠèªèããŠããå¿
èŠããããŸãããããã£ãŠãåå11æïŒãã³ããŒæéãèŠæ±ããããŸãŒã³ïŒãŸãã¯åå10æïŒèŠæ±ããããŸãŒã³ïŒãè¡šãããšã«ãªã£ãŠããŸããããµã³ãŒã«ã¹æéãçºä¿¡ãŸãŒã³ïŒïŒ ã©ã¡ããã䞻匵ã§ãããšæããŸãã
ã¡ãªã¿ã«ã Date
ãªããžã§ã¯ãã¯ãã¿ã€ã ãŸãŒã³ããªãã»ããã®æŠå¿µããªãUTCããªç§åäœã®ã¿ã€ã ã¹ã¿ã³ããè¡šããšããç¹ã§ãISOæ¥ä»æååãšDTSTARTæååã®äž¡æ¹ãšã¯ç°ãªããŸãã ãããã£ãŠãç®çã®æå»ã®ã¿ã€ã ã¹ã¿ã³ãã_æ£ãããŸãŒã³ã§_è¡šãã®ãæãçã«ããªã£ãŠãããšæããŸããã€ãŸããããµã³ãŒã«ã¹ã«ããŠããã³ããŒã§æå»ãè¡šãããå Žåã¯ãçžå¯Ÿã§åæåãããDateãªããžã§ã¯ããæž¡ãå¿
èŠããããŸãããªãã»ãããé©çšãããŸãïŒãããã£ãŠãäžèšã®äŸã¯ãã³ããŒã®åå11æãè¡šããŸãïŒã ãã ããããã¯çŽããããã§ãããã¥ãŒãšãŒã¯ã«æ
è¡ããŠåãæéã代衚ãããå Žåã¯ã new Date(2018, 10, 1, 13, 0, 0)
ãšæžãå¿
èŠãããããã§ãã
ããŒã«ã«æ¥ä»ã®æŠå¿µå šäœããŠã£ã³ããŠã®å€ã«åºãããšã®å©ç¹ã¯ãããã«å¯ŸåŠããå¿ èŠããªãããšã§ãã 衚瀺ãããæ¥ä»ãšæå»ã¯æµ®åæéãšããŠæ±ãããšãã§ããå€æãè¡ããã«ä»»æã®ã¿ã€ã ãŸãŒã³ã«æ圱ã§ããŸãã
ãã¡ãããããã¯Chromeã®ãããªãšã³ãžã³ã®åäœã«ãã£ãŠè€éã«ãªããŸãã
ããªãã®ç®çã®ããã«ãããªãã¯ããããããªããããããšã«ãã£ãŠããªããæãå€ãåŸãããšãã§ããŸãïŒ
rule.all().map(d => new Date(
d.getUTCFullYear(),
d.getUTCMonth(),
d.getUTCDate(),
d.getUTCHours(),
d.getUTCMinutes(),
d.getUTCMilliseconds()
))
ç§ã¯çŸåšããããé©åãªã©ã€ãã©ãªã«å±ããŠãããã©ãããå€æããããšããŠããŸã...
ããããšãïŒ ããªãã®åçã¯ç§ã«ãšã£ãŠæ¬åœã«æ確ãªãã®ã§ããã æšæ¥ããã¹ãŠãç解ããããšããŠãããšããç§ã¯ç²ããŠçãå°œããŠãããšæããŸãã ç§ã¯ä»äœãèµ·ãã£ãŠããã®ããèŠãŠãããªããæ£ããã§ããç§ã¯tzid
ãã©ã¡ãŒã¿ã䜿çšãããšãã«ééã£ãæéãæž¡ããŠããŸããã
ããªãã®ç®çã®ããã«ãããªãã¯ããããããªããããããšã«ãã£ãŠããªããæãå€ãåŸãããšãã§ããŸãïŒ
rule.all().map(d => new Date( d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCMilliseconds() ))
ç§ã¯çŸåšããããé©åãªã©ã€ãã©ãªã«å±ããŠãããã©ãããå€æããããšããŠããŸã...
ããã¯ç§ã®ããã«åããïŒ æ¬åœã«ããããšãã rule.all()
ãšrule.between()
ã«ãã£ãŠè¿ããããã®ãæ§æããæ¹æ³ãããã°ãããã¯çŽ æŽãããããšã§ããããããã°ãããã«å¥ã®é倧ãªå€æŽãå°å
¥ããããšã¯ãããŸããããäžèšã®åäœããã€ãã£ãã«ååŸã§ããŸãã rrulestr()
ãŸãã¯RRule.fromString()
ã䜿çšãããããè¿ãããæ¥ä»ã®ã¿ã€ããæå®ããããã®è¿œå ã®åŒæ°ãªã©ã䜿çšããããšãèããŠããå Žåããããå®çŸããæ¹æ³ãããããŸããã
æŽæ°ïŒäžèšã®d.getUTCMilliseconds()
ãd.getUTCSeconds()
ã«å€æŽããå¿
èŠããããŸã
ãããã£ãŠãç§ã®ã·ã¹ãã ã®ã¿ã€ã ãŸãŒã³ãèŠæ±ãããã¿ã€ã ãŸãŒã³ãšåãã§ããå Žåã«ãœãªã¥ãŒã·ã§ã³ã¯æ©èœããŸãããã·ã¹ãã ã®ã¿ã€ã ãŸãŒã³ãšç°ãªãå Žåã«ãèŠæ±ãããã¿ã€ã ãŸãŒã³ã®æ¥ä»ãRRuleã«è¿ãæ¹æ³ãç解ããããšãããšã²ã©ãæéããããŸãã èŠæ±ãããã¿ã€ã ãŸãŒã³ã§ã¯ãªããã·ã¹ãã ã®ã¿ã€ã ãŸãŒã³ã§è¡šãããæ¥ä»ãåžžã«è¿ããŸãã äŸïŒ
America/Denver
ã«èšå®ããŸãRRule.fromString(
"DTSTART;TZID=America/Denver:20181101T130000;\n"
+ "RRULE:FREQ=WEEKLY;BYDAY=MO,WE,TH;INTERVAL=1;COUNT=7"
).all().map(d => new Date(
d.getUTCFullYear(),
d.getUTCMonth(),
d.getUTCDate(),
d.getUTCHours(),
d.getUTCMinutes(),
d.getUTCSeconds()
));
çµæã¯æ£ããã§ãïŒç§ãæåŸ /å¿ èŠãšããŠãããã®ã«å¯ŸããŠïŒïŒ
(7)Â [Thu Nov 01 2018 13:00:00 GMT-0600 (Mountain Daylight Time), Mon Nov 05 2018 13:00:00 GMT-0700 (Mountain Standard Time), Wed Nov 07 2018 13:00:00 GMT-0700 (Mountain Standard Time), Thu Nov 08 2018 13:00:00 GMT-0700 (Mountain Standard Time), Mon Nov 12 2018 13:00:00 GMT-0700 (Mountain Standard Time), Wed Nov 14 2018 13:00:00 GMT-0700 (Mountain Standard Time), Thu Nov 15 2018 13:00:00 GMT-0700 (Mountain Standard Time)]
America/New_York
ã«å€æŽããŸãã·ã¹ãã ã®ã¿ã€ã ãŸãŒã³ã§è¡šããããããçµæã¯ç°ãªããŸãã
(7)Â [Thu Nov 01 2018 15:00:00 GMT-0400 (Eastern Daylight Time), Mon Nov 05 2018 15:00:00 GMT-0500 (Eastern Standard Time), Wed Nov 07 2018 15:00:00 GMT-0500 (Eastern Standard Time), Thu Nov 08 2018 15:00:00 GMT-0500 (Eastern Standard Time), Mon Nov 12 2018 15:00:00 GMT-0500 (Eastern Standard Time), Wed Nov 14 2018 15:00:00 GMT-0500 (Eastern Standard Time), Thu Nov 15 2018 15:00:00 GMT-0500 (Eastern Standard Time)]
ããããçµæãã·ã¹ãã ã®ã¿ã€ã ãŸãŒã³ãçã®UTCã§ã¯ãªãã America/Denver
ã®æéãè¡šãããã«ãããã®ã§ãã America/Denver
ã«åãŸãŒã³åããã«ã¯ã©ãããã°ããã§ããïŒ Luxonã«æ
£ããŠããªãã®ã§ã代ããã«moment()
ãè©ŠããŸããã
RRule.fromString(
"DTSTART;TZID=America/Denver:20181101T130000;\n"
+ "RRULE:FREQ=WEEKLY;BYDAY=MO,WE,TH;INTERVAL=1;COUNT=7"
).all().map(d => moment(new Date(
d.getUTCFullYear(),
d.getUTCMonth(),
d.getUTCDate(),
d.getUTCHours(),
d.getUTCMinutes(),
d.getUTCSeconds()
)).tz('America/Denver').toDate());
ããããããã¯ãã¥ãŒãšãŒã¯æéäžã«åãããšãè¿ããŸããããã¯ã toDate()
ãå³åº§ã«ã·ã¹ãã ã®ã¿ã€ã ãŸãŒã³ã«æ»ãããã§ãïŒå°ãªããšãChromeã§ã¯ïŒã
@shorlbeckãæ°ã¥ãã®æ¹ãããã£ããããšæããŸãããMDTãšEDTã®äž¡æ¹ã®çµæã¯UTCã§åããªã®ã§ãç§ã®è³ªåã¯æ¬¡ã®ãšããã§ããæµ®åæéã ãã§ãªãã TZID
ãã©ã¡ãŒã¿ã䜿çšããŠãããããã§ããïŒ ã·ã¹ãã ã®ã¿ã€ã ãŸãŒã³ã«é¢ä¿ãªãåžžã«13:00ãçæããå Žåã¯ãæµ®åæéïŒåºæ¬çã«ã¯åãã§ããã$ DSTART;TZID=<timezone>:<datetime>
ïŒ$ã§ã¯ãªãDSTART:<datetime>
ã䜿çšïŒããå§ãããŸãã
13:00ç䌌UTCã§ãã Chromeã®åé¡ãåé¿ãããå Žåã§ãã以åã®ã³ã¡ã³ãã®æ¹æ³ã䜿çšããŠããŒã«ã«ã®æ¥ä»ã«å€æããå¿ èŠããããŸãã
@davidgoliãããããã ãã æµ®åæé/ç䌌UTCãå®éã«ã©ã®ããã«æ©èœããããç解ããåŸãå®éã«ã¯tzidãã©ã¡ãŒã¿ãŒãå¿
èŠãªãããšã«æ°ã¥ããŸããã§ããã ã€ãŸããäžèšã®.map()
ãœãªã¥ãŒã·ã§ã³ãå¿
èŠãªããšããããšã§ãã ããªãã®ã³ã¡ã³ãã¯ç§ãæ£ããæ¹åã«åããŸããã æ¬åœã«ããããšãã
ãããç§ãé·ãéåãçµãã§ããäžã§æãçŽããããããšã§ã¯ãªããšèšã£ããåãã€ãã§ãããããä»ã¯æ£ããæ¹åã«åãã£ãŠããããšãå¬ããæããŸãã
å¿ èŠãªãã®ïŒã¿ã€ã ãŸãŒã³ã®ãªããããŒãã£ã³ã°æ¥ä»ïŒã®æ瀺çãªè¡šçŸã䜿çšããããšãæ€èšããŸãããïŒ UTCã¿ã€ã ãŸãŒã³ã§ãã€ãã£ãJSæ¥ä»ã䜿çšããããã¥ã¡ã³ãã§UTCã§ãããšäž»åŒµããããšã¯ãDSTã®ãã°ãçºçãããŸã§æ©èœãããããéåžžã«æ··ä¹±ããŸãã
ãªããžã§ã¯ããææ¡ããŸã(year, month, day, hours?, minutes?, seconds?, milliseconds?)
.toDate()
ã¡ãœãããæã€ãRRuleDateããšåŒã³ãŸãããã
ãã®RRuleDateã¯ã before()
ã after()
ã between()
ãããã³all()
ãè¿ããããã®ã§ããã before()
ã after()
ã®ã¿ã§ãã between()
ãããã³dtstart
ãªãã·ã§ã³ã¯ããã©ã¡ãŒã¿ãŒãšããŠåãå
¥ããå¿
èŠããããŸãã