4

私はこのISO日付を持っています:

var v = '2013-07-09T13:27:29.000Z';

私がこれを行う場合:

var g = moment(v).format();

コンソールは g 値を正しい現地時間として表示します2013-07-08T17:25:08-03:00

しかし、前の時間を取得するためにこれを行うと:

console.log(moment(g).startOf('day').fromNow());

Moments は、書式設定された g の代わりに元の v ISO を使用して前の時間を計算します。

なんで?

編集: 別の時間プラグイン (jquery.timeago) をテストしましたが、元の v 値を渡すと、ローカル時間への解析で同じエラーが発生します。

ここで何が間違っていますか?このコードはクライアント側で実行されているため、すべてのプラグインはユーザーに正しい現地時間を返すはずでした。

編集2 :私がやろうとしていることに関するより関連性の高い情報:

var v = notifs.ntime; //2013-07-09T13:27:29.000Z
var m = moment(v).zone(v).format(); // 2013-07-09T13:27:29+00:00 (wrong local)
var m2 = moment(v).format();  // 2013-07-09 10:27:29 (correct local)
var r = moment(v).zone(v).startOf('day').fromNow() // 21 hours ago (wrong)
var r2 = moment(v).startOf('day').fromNow() // 18 hours ago (wrong)
console.log(v);
console.log(m);
console.log(m2);
console.log(r);
console.log(r2);
console.log('-------------------');
/*
    2013-07-09T13:27:29.000Z                            
    2013-07-09T13:27:29+00:00                           
    2013-07-09T10:27:29-03:00                           
    21 hours ago                        
    18 hours ago                            
    -------------------

    I expected "8 hours ago" as now is 18:10 and (v) was set on 10:27 (m2)
*/
4

1 に答える 1

3

あなたが探しているものに従っているかどうかはよくわかりません。

g変数を使用することで、基本的にこれを行っています。

moment(moment(v).format()).startOf('day').fromNow()

それは少し冗長です。これとまったく同じです:

moment(v).startOf('day').fromNow()

これにより、現在から該当する現地日の開始までにどれくらいの時間が経過したかがわかりますv

現在からUTC日の開始までに経過した時間を探している場合は、v代わりにこれを使用します。

moment.utc(v).startOf('day').fromNow()

または、わずかに異なる構文を使用しますが、効果は同じです。

moment(v).utc().startOf('day').fromNow()

他のものを探していた場合は、明確にしてください。

ウォークスルー

元のコードを自分のコンピューターで実行するとどうなるか見てみましょう。私は米国のアリゾナ州にいます。ここは夏時間のない UTC-7 です。

// we'll start with the string you provided
var v = '2013-07-09T13:27:29.000Z';

// and the redundant moment, but we'll take a look at the formatting
var g = moment(v).format();

console.log(g);                 // 2013-07-09T06:27:29-07:00
console.log(moment(g).format()) // 2013-07-09T06:27:29-07:00  (it didn't change)

// start of the local day is midnight in the local time zone
console.log(moment(g).startOf('day').format())  // 2013-07-09T00:00:00-07:00

// here's my time right now
console.log(moment().format())  // 2013-07-09T13:56:54-07:00

// and your final bit of code
console.log(moment(g).startOf('day').fromNow());  // 14 hours ago

ご覧のとおり、1 日の開始を決定する際にローカル タイム ゾーンを使用して、正しく実行されています。もちろん、これを別のタイム ゾーンで実行すると、別の結果が返されます。これは、すべてのタイム ゾーンにそれぞれの曜日の概念があるためです。一貫した出力が必要な場合は、startOf('day')呼び出しを削除します。

おすすめ

前回の更新で 8 時間かかるとのことでしたが、実際には 8 時間は必要なかったようですstartOf('day')。これを行うだけです:

moment(v).fromNow()

どちらかを含める必要はありません.zone()

于 2013-07-09T20:36:27.540 に答える