私は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
違いはどこから来たのですか?
日付文字列は、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, '/'));
理由は言えません。たぶん、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);
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]);
}