119

JavaScriptの日付オブジェクトは、私がいる場所のために常にUTC+2で表されます。したがって、このように

Mon Sep 28 10:00:00 UTC+0200 2009

問題はJSON.stringify、上記の日付をに変換することです

2009-09-28T08:00:00Z  (notice 2 hours missing i.e. 8 instead of 10)

私が必要としているのは、日時が尊重されることですが、そうではないので、

2009-09-28T10:00:00Z  (this is how it should be)

基本的に私はこれを使用します:

var jsonData = JSON.stringify(jsonObject);

置換パラメーター(stringifyの2番目のパラメーター)を渡そうとしましたが、問題は値がすでに処理されていることです。

また、日付オブジェクトを使用toString()してみtoUTCString()ましたが、これらも私が望むものを与えてくれません。

誰か助けてもらえますか?

4

18 に答える 18

73

最近、私は同じ問題に遭遇しました。そして、次のコードを使用して解決されました。

x = new Date();
let hoursDiff = x.getHours() - x.getTimezoneOffset() / 60;
let minutesDiff = (x.getHours() - x.getTimezoneOffset()) % 60;
x.setHours(hoursDiff);
x.setMinutes(minutesDiff);
于 2009-09-28T11:39:56.760 に答える
48

JSON は、Date.prototype.toISOString現地時間を表さない関数を使用します。これは、変更されていない UTC で時間を表します。日付出力を見ると、UTC+2 時間であることがわかります。これが、JSON 文字列が 2 時間変化する理由です。ただし、これにより、複数のタイムゾーンで同じ時間を正しく表現できる場合。

于 2009-09-28T17:50:39.180 に答える
22

念のため、「2009-09-28T08:00:00Z」の最後の「Z」は、時刻が実際に UTC であることを意味することに注意してください。

詳細については、 http://en.wikipedia.org/wiki/ISO_8601を参照してください。

于 2009-09-28T18:18:49.407 に答える
12

ここに別の答えがあります(そして個人的にはそれがより適切だと思います)

var currentDate = new Date(); 
currentDate = JSON.stringify(currentDate);

// Now currentDate is in a different format... oh gosh what do we do...

currentDate = new Date(JSON.parse(currentDate));

// Now currentDate is back to its original form :)
于 2014-07-25T00:50:29.187 に答える
3

私は、米国の東海岸でのみ機能し、UTC で日付を保存しない従来のものを使用して、これに少し遭遇しました。これはすべて EST です。ブラウザーでのユーザー入力に基づいて日付をフィルター処理する必要があるため、JSON 形式で現地時間の日付を渡す必要があります。

すでに投稿されているこのソリューションについて詳しく説明するために-これは私が使用しているものです:

// Could be picked by user in date picker - local JS date
date = new Date();

// Create new Date from milliseconds of user input date (date.getTime() returns milliseconds)
// Subtract milliseconds that will be offset by toJSON before calling it
new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toJSON();

したがって、私の理解では、これは先に進み、タイムゾーンオフセット(分を返す)に基づいて開始日から時間(ミリ秒(したがって60000))を減算します-時間の追加を見越して toJSON() が追加されます。

于 2019-08-06T00:02:48.000 に答える
2

通常、各ユーザーに自分の現地時間で日付を表示する必要があります-

そのため、GMT (UTC) を使用しています。

Date.parse(jsondatestring) を使用して現地時間の文字列を取得します。

各訪問者に現地時間を表示したくない場合を除きます。

その場合は、アナトリーの方法を使用してください。

于 2009-09-28T13:34:15.400 に答える
0

の代わりに、常に正しい日付と時刻を与えるformattoJSON関数を使用できます+GMT

これは最も堅牢な表示オプションです。トークンの文字列を受け取り、それらを対応する値に置き換えます。

于 2016-05-19T17:45:18.667 に答える
0

この場合、日付を UNIX タイムスタンプに変換する必要があると思います

timestamp = testDate.getTime();
strJson = JSON.stringify(timestamp);

その後、それを再利用して日付オブジェクトを作成し、フォーマットすることができます。JavaScript とtoLocaleDateString( https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Date/toLocaleDateString )を使用した例

newDateObject = new Date(JSON.parse(strJson));
newDateObject = newDateObject.toLocalDateStrin([
  "fr-FR",
]);

stringify を使用して AJAX を使用する場合、現在は役に立ちません。タイムスタンプを送信してスクリプトで取得するだけです。

$newDateObject = new \DateTime();
$newDateObject->setTimestamp(round($timestamp/1000));

getTime()はミリ秒単位の時間を返し、PHP 関数は秒単位で時間がかかることに注意してくださいsetTimestamp。1000 で割る必要があるのはそのためですround

于 2020-10-30T11:06:43.500 に答える
0

私はAngular 8でこれを試しました:

  1. モデルの作成:

    export class Model { YourDate: string | Date; }
    
  2. あなたのコンポーネントで

    model : Model;
    model.YourDate = new Date();
    
  3. 保存するために Date を API に送信します

  4. API からデータをロードするときは、次のようにします。

    model.YourDate = new Date(model.YourDate+"Z");

タイムゾーンで日付を正しく取得します。

于 2020-03-03T13:16:27.830 に答える
0

私は同じ問題に遭遇しました。私が解決した方法は次のとおりです。

  var currentTime = new Date();

  Console.log(currentTime); //Return: Wed Sep 15 13:52:09 GMT-05:00 2021
  Console.log(JSON.stringify(currentTime));  //Return: "2021-09-15T18:52:09.891Z"

var currentTimeFixed = new Date(currentTime.setHours(currentTime.getHours() - (currentTime.getUTCHours() - currentTime.getHours())));

  Console.log(JSON.stringify(currentTimeFixed)); //Return:  "2021-09-15T13:52:09.891Z"
于 2021-09-15T18:54:05.783 に答える