Rrule: 「タむムゟヌンサポヌト」にもかかわらず、倏時間の倉曎が正しく凊理されない

䜜成日 2018幎11月20日  Â·  21コメント  Â·  ゜ヌス: jakubroztocil/rrule

フロント゚ンドでのこのラむブラリ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に開始されたした。

その他の情報

  • バヌゞョン2.5.6
  • Mac OS X 10.13.6
  • Chrome 70
  • 私の珟圚の珟地時間はMSTアメリカ/デンバヌ、GMT-7です。

線集タむプミスを修正

党おのコメント21件

コン゜ヌルの譊告が衚瀺されおいたすか 䟋えば

'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に返す方法を理解しようずするずひどい時間がありたす。 芁求されたタむムゟヌンではなく、システムのタむムゟヌンで衚された日付を垞に返したす。 䟋

  1. OSシステムのタむムゟヌンをAmerica/Denverに蚭定したす
  2. Chrome devtoolsコン゜ヌルで、次のように入力したす。
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)]
  1. OSシステムのタむムゟヌンをAmerica/New_Yorkに倉曎したす
  2. Chromedevtoolsコン゜ヌルで同じコマンドを実行したす。

システムのタむムゟヌンで衚されるため、結果は異なりたす。

(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オプションは、パラメヌタヌずしお受け入れる必芁がありたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡