3

fullcalendar を正常に初期化します。したがって、現在の日付を表します。(深夜→深夜、1日、1時間枠)

他のデータソースから、タイムスタンプ付きのデータを取得します。形式は「YYYY-MM-DD HH:mm」(文字列として送信、タイムゾーン情報なし)

そのため、その文字列をモーメント オブジェクトに変換し、fullcalendar.start および .end に対してテストして、それが含まれているかどうかを確認します。

moment("2016-04-07 00:00") == $('#calendar').fullCalendar('getView').end

これは、次のコマンドでもfalseになります

$('#calendar').fullCalendar('getView').end.format("YYYY-MM-DD HH:mm")

戻り値

"2016-04-07 00:00"

私もdiffと比較してみました

moment("2016-04-07 00:00").diff( $('#calendar').fullCalendar('getView').end,"minutes")

返す

120

Chrome Dev Tools の calendars.end オブジェクトに関するいくつかの調査では、内部的に次のように表されていることが明らかになりました。

2016-04-07 02:00 GMT+0200

これは私には奇妙に見えます。私は GMT の 2 時間前のタイムゾーンにいます。つまり、2016-04-07 00:00 GMT+0200 と正しく表示されるべきではないでしょうか? これは、上記の差分テストが 120 分という結果になった理由も説明しています。

誰か助けてくれませんか?変換の問題がどこから来たのかわかりません。タイムゾーン情報なしで日付のみを使用しています。上記のように、fullcalendar は gotodate 情報なしで初期化し、00:00 から 00:00 までのタイム バーを表示します。では、なぜこの 2 時間の差があるのでしょうか。

4

2 に答える 2

2

どうもありがとう。私は今、物事をよりよく理解しています。比較しようとした日付のいくつかは「今」でした。私は「今」を手に入れました

var n = moment()

それは私のタイムゾーンを含む日時であることが判明しました。

たとえば、moment().format() の結果は '2016-04-07 00:00 GMT+0200' になり、完全な calendar.end との比較がtrueになることを除いて、これがどのように間違っていたかがわかりますが、'2016- としてfalseでした04-07 00:00 GMT+0200' は UTC で '2016-04-06 22:00' です。

として

moment.utc() 

動作しません、私は使用して終わったことを知っています

moment.utc(moment().format('YYYY-MM-DD HH:mm'))

これは、UTC での「数値同時時間」と同じようにローカル時間を処理するため、機能するようになりました。したがって、fullcalendar が内部で時間を処理する方法 (あいまいなゾーンの瞬間) と一致します。

ありがとう

于 2016-04-09T09:42:45.123 に答える
1

いくつかのこと:

  • timezoneパラメーターは、FullCalendar がタイム ゾーンでどのように動作するかを制御します。

  • デフォルトでは、FullCalendar は「あいまいなゾーンの瞬間」を使用します。これらは、fullCalendar 内で行われた moment.js のカスタマイズです。 ドキュメントの状態

    moment オブジェクトも拡張され、タイムゾーンが指定されていない日付を表すようになりました。内部的には、これらの瞬間は UTC モードで表されます。

    したがって、このモードで日付を比較するには、それらが UTC であるかのように扱います。

    moment.utc("2016-04-07 00:00")
    
  • モーメントを比較するには、モーメント クエリ関数isSameisBeforeisAfterisSameOrBeforeisSameOrAfterおよび を使用しisBetweenます。

  • この場合、FullCalendar の開始日は包括的ですが、終了日は排他的であるため、おそらく次のように比較する必要があります。

    var cal = $('#calendar').fullCalendar('getView');
    var start = cal.start;
    var end = cal.end;
    
    var m = moment.utc("2016-04-07 00:00");  // your input
    var between = m.isSameOrAfter(start) && m.isBefore(end);
    

isBetween排他性を制御できるようにする将来のリリースの保留中の機能強化がありますが、現在isBetweenは完全に包括的であるため、ここに示す機能の組み合わせを使用する必要があります。

于 2016-04-08T16:05:04.443 に答える