8

ユーザー設定に基づいて電子メール メッセージをタイムアウトさせようとしています。朝の計算は正しく機能していますが、日付が期待どおりに動作しないため、夕方のメールが送信されません。

まず、時間を取得し、ユーザーの場所などに基づいて調整を実行するために使用しているコードを次に示します。

var time = moment();
var machineTZ = time.zone();
var userTZ = 420;
var diffTZ = userTZ - machineTZ;

var oneHour = moment(time).add('minutes', 60);

var morningRun = moment().startOf('day');
morningRun.hour(7).minute(0);
morningRun.add('minutes', diffTZ);

var eveningRun = moment().startOf('day');
eveningRun.hour(19).minute(30);
eveningRun.add('minutes', diffTZ);

別のメールを送信するスケジュールを設定する時間かどうかを毎時間チェックしています。現在、これはハードコーディングされていますが、ユーザー設定を追加し始めると、外出したい現地時間を選択できるようになります。

トラブルシューティングのために値をデバッグしています。(サーバーの観点から) 早朝に実行されたジョブからの出力は次のとおりです。

lastRun:    2013-10-12T00:06:55.088Z (this one is being run at 1 am)
morningRun: 2013-10-11T14:00:00.000Z
eveningRun: 2013-10-12T02:30:00.000Z

実行数は、私が期待するとおりです。2 時間以内に夕方のメールを送信したいと考えています (私の時間の午後 7 時 30 分 = 翌日のサーバー時間の午前 2 時 30 分)。

1 時間後にもう一度見ると、次のことがわかります。

lastRun:    2013-10-12T01:06:58.267Z (this one is at 2 am)
morningRun: 2013-10-12T14:00:00.000Z
eveningRun: 2013-10-13T02:30:00.000Z <---- what?

まだ 10/12 (まだ 10/13 ではない) なのに、突然私の夜の計算が日付変更線をひっくり返しました。このため、30 分ではなく 24 時間以内にメールを送信する必要があると判断されたため、メールをスケジュールする必要があるかどうかを確認するチェックが失敗しました。

しばらくの間、この奇妙な矛盾と戦っていましたが、なぜそれが起こっているのかを理解し、上記のタイムゾーンのものを使用して計算を調整したと思いましたが、それはうまくいきませんでした:(.これは確かにある種の奇妙なようですこれが起こると予想されるバグ:

//Today is 10/12
var eveningRun = moment().startOf('day'); //10/12/2013 - 00:00:00
eveningRun.hour(19).minute(30); //10/12/2013 - 19:30
eveningRun.add('minutes', diffTZ); //10/13/2013 - 2:30 am

これは、ある時点で「今日」が実際には 10/13 であると判断し、代わりに 10/14 に夜のランが行われるように設定するまで機能します。ヘルプをいただければ幸いです。または、これがバグである場合は、解決されるまでこの問題を回避するために何ができるかを知りたいです。

4

1 に答える 1

20

計算machineTZdiffTZたり、分を追加したりする必要はありません。代わりにこれを行うだけです:

moment().zone(userTZ).startOf('day').hour(7).minute(0)

ただし、 のような値420はタイム ゾーンではなく、タイム ゾーンオフセットであることに注意してください。特定の時点のオフセットが何であるかを示すだけです。一方的に適用しているため、夏時間中に誤った結果が得られる場合があります。

代わりに、moment-timezoneアドオンを使用して、代わりに次のようにしてください。

moment().tz("America/Los_Angeles").startOf('day').hour(7).minute(0)

timezone タグ wiki、特に「Time Zone != Offset」および「The IANA/Olson Time Zone Database」というタイトルのセクションも参照してください。

于 2013-10-13T05:56:10.953 に答える