14

アクションを実行してからの経過時間をユーザーに表示したいと考えています。

アクションが発生した日時は、サーバーのタイムゾーンでサーバーに保存されます。ユーザーのコンピューターのタイムゾーンがサーバーのタイムゾーンよりも 12 時間進んでいる場合、ユーザーが今何かを追加すると、moment.jsfromNow()just now.

これを解決するために、次の方法を試しています。

var actionTime = moment( action.timeStamp);//time of when user performed action 
var serverTime = moment().zone('-07:00'); //current server time

console.debug( serverTime);//outputs Wed Sep 11 2013 15:19:51 GMT-0700

var timeAgo = serverTime.from( actionTime);

しかし、これにもかかわらずtimeAgo、クライアントのタイムゾーンとサーバーのタイムゾーンの違いが表示されます (つまり、「今」ではなく「12 時間前」が表示されます)。

これを修正する方法、または私が間違っていることを知っている人はいますか?

4

3 に答える 3

14

私はそれを別の方法で解決しました。おそらく、このオプションは質問が行われたときは不可能でしたが、今は簡単かもしれません。

moment-timezone.jsを使用しました (これにはmoment.js 2.6.0+ が必要です)。

次のように、デフォルトのタイムゾーンをサーバーのタイムゾーンに設定します。

moment.tz.setDefault("America/New_York"); // "America/New_York" in my case

あとは普通に使えます。fromNow()クライアントのタイムゾーンを使用して、その瞬間から経過した時間を計算します。

moment(myDatetime).fromNow();
于 2015-07-06T14:43:28.060 に答える
14

理想的には、サーバーからクライアントに UTC タイムスタンプを渡す必要があります。これは、サーバー全体を UTC に切り替える必要があるという意味ではなく、Web 経由で送信する前に、データベースの時刻をサーバーの UTC に変換することを意味します。確かに、実際に UTC で時刻を保存した方が良いでしょうが、今はそのような変更を行う立場にないとおっしゃいました。ただし、サーバー上で何も変更できないという前提に基づいて作業を進めましょう。

また、サーバーがUTC-07:00 オフセットに固定されていると仮定します。実生活では、これはアリゾナのような夏時間に従わない場所にのみ当てはまります。したがって、ロサンゼルスにいて太平洋時間にいる場合、データの一部は UTC-07:00 に基づいていますが、一部は UTC-08:00 に基づいています。JavaScript で実行する場合は、さらに多くの作業が必要になります。

また、入力が既に ISO8601 形式の文字列であると仮定しましょう。(そうでない場合はお知らせください。このコードを調整します。)

var s = "2013-09-11 18:00:00";  // from action.timeStamp

var actionTime = moment(s + "-07:00", "YYYY-MM-DD HH:mm:ssZ");

var timeAgo = actionTime.fromNow();

他のコードが機能しなかった理由は、最初の行で、ブラウザーのタイム ゾーンの影響を受けるためです。2 行目のゾーン セッターは、フォーマットのためにゾーンを変更するだけで、実際の時間は変更しません。

また、デバッグのためにコンソールに一瞬をダンプするときは、必ず出力用にフォーマットしてください。それ以外の場合は、内部のプロパティ値を見ているだけであり、直接意味がある場合とない場合があります。

于 2013-09-12T01:10:12.440 に答える
1

同じ問題があり、上記のコメントを使用してコードを変更しました。解決するために次のことを行いました。

  transform(value: string) {
    var time = moment(value).utc();
    return moment(time, "YYYYMMDD").fromNow();
  }

.fromNow() を適用する前に、変換する .utc() がありませんでした

これはIonic 3のパイプ内で使用されており、上記のコードはパイプロジックからのものであることに注意してください。

于 2017-08-01T07:06:29.297 に答える