web-dev-qa-db-ja.com

Javascriptの日付はiOSでは無効です

私はPhonegapベースのiOSアプリに取り組んでいます。これはAndroid向けに既に行われています。次の行は、Androidで正常に機能していますが、iOSでは機能していません。なぜですか?

var d = new Date("2015-12-31 00:00:00");
console.log(d.getDate() + '. ' + d.getMonth() + ' ' + d.getFullYear();

Androidの結果:

31.11 2015

IOSでの結果:

NaN. NaN NaN

違いはどこから来たのですか?

39

日付文字列は、new Dateで動作するように指定された形式ではありません。仕様の唯一の形式は ISO-8601の簡易バージョン ですが、これはES5でのみ追加されたものなので、サポートは簡単に行えます。あなたの文字列はその形式ではありませんが、本当に近いです。

スペースをTに変更すると、仕様になります:

var dateString = "2015-12-31 00:00:00";
var d = new Date(dateString.replace(' ', 'T'));

(実際には文字列リテラルを使用していないと仮定しているため、replace呼び出しです。)

ES2015で修正されたES5仕様にエラーがあったことに注意してください(ES6):文字列にタイムゾーンインジケーターがない場合はどうなりますか。 ISO-8601では、インジケータは「現地時間」を意味しませんが、ES5仕様では、デフォルトでZ(UTC —緩やかに、GMT)になっています。彼らはES2015仕様で修正しましたが、残念なことに、一部のJavaScriptエンジンはES5仕様に準拠し、他のエンジンはISO-8601(および現在はES2015)に準拠しました。しかし、待ってください、悪化します:日付を含む文字列に現地時間を使用すると、既存のコードに問題があることが判明しました(そしてTC39本当に、実際には既存のコードを壊さないようにします)日付のみの文字列の場合、UTCとして解釈しますが、日付/時刻の文字列の場合、現地時間として解釈します。

したがって、すべての楽しさとゲームで、クロスブラウザーをしっかりサポートするには、タイムゾーンインジケーターを含める必要があります。そうしないと、UTCとローカルタイムのどちらとして解釈されるかわかりません。 GMTにZを使用するか、+/-に続いてHH:MMを使用してオフセットを与えることができます。 (CSTのような略語は、標準がないため許可されません。)

まだサポートされていない場合は、が指定されていなくても、ほぼローカルでYYYY/MM/DD HH:MM:SS(ローカル時間として解釈されます)がサポートされます。そう:

var dateString = "2015-12-31 00:00:00";
var d = new Date(dateString.replace(/-/g, '/'));
96
T.J. Crowder

理由は言えません。たぶん、iOSはAndroidと同様にJavascript Date関数をサポートしていないか、別の形式をサポートしていないのでしょうか?

しかし、私はあなたに回避策を与えることができます:

var s = "2015-12-31 00:00:00".split(" ")[0].split("-"),
    d = new Date( s[0], s[1], s[2], 0, 0, 0 );

console.log(d);

var s = "2015-12-31 00:00:00".replace(/[ :]/g, "-").split("-"),
    d = new Date( s[0], s[1], s[2], s[3], s[4], s[5] );

console.log(d);
6
andlrc

IOSとAndroidの両方で動作し、不要な場合に文字列操作を回避するソリューションは

let fullDate = "1991-03-29 00:00:00";
let date = new Date(fullDate);

// In case its IOS, parse the fulldate parts and re-create the date object.
if(Number.isNaN(date.getMonth())) {
  let arr = fullDate.split(/[- :]/);
  date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
}
2
Eyal c