2017-04-09 10 views
1
var start = new Date("2017-04-09T21:00:00"); 

出力:月2017年4月10日5時00分00秒GMT + 0800(08)新しい日付( "")を追加GMT時間

それがあることを仮定:日4月09 2017 21:00: 00 GMT + 0800(+08)

+3

リモート 'T'から ' "2017-04-09T21:00:00"' – gurvinder372

+0

しかし、私は 'T'と日付を入れながら、それが正常に動作し、それよりもFullCalendarを使用しています。 – User1911

+0

start.toUTCString()はどうでしょうか? ? – ThatAwesomeCoder

答えて

1

非常に簡単です。あなたはDateコンストラクタで文字列を解析することはありません黄金のルールがあります

var start = new Date("2017-04-09T21:00:00"); 
 
start.setTime(start.getTime() + start.getTimezoneOffset()*60*1000); 
 

 
console.log(start);

+0

'new Date(" 2017-04-09T21:00:00 ")'が異なるブラウザーで異なる結果を返すことを除いて。私の場合、Firefox 49では上記の "2017-04-09T01:00:00.000Z"が返されます。 Safariでは "2017-04-09T11:00:00.000Z"を返します。 ECMA-262によれば、それはローカルとして扱われるべきであるので、ローカルタイムゾーンの調整は必要ではないはずです。 – RobG

+0

firefoxでは、Date()コンストラクタにパラメータを渡すと、現地時間として扱われ、緑色の平均時間が返されます。しかし、クロムではパラメータは緑の平均時間として扱われ、現地時間が返されます。したがって、あなたはブラウザを検出する必要があり、これに応じて時間(出力)を計算します。しかし、Safariが予期せぬ結果を返す理由を理解できませんでした。 –

+0

あなたがブラウザのスニッフィングの道を歩いていると、あなたは苦痛の世界にいます。文字列を手動で解析するだけです。 – RobG

0

(またはDate.parseは、彼らが構文解析のための等価です):あなたはこれを試すことができます。

ECMA-262によれば、タイムゾーンなしでISO 8601形式の日付がローカルとして扱われるべきである:

オフセット時間帯が存在しない場合、日付のみの形態がUTC時間として を解釈し、タのデータれます時刻形式は現地時間として解釈されます。

したがってnew Date("2017-04-09T21:00:00")は、ホストタイムゾーンで2017年4月9日の午後9時の日付を返す必要があります。

ただし、Safari 10とChrome 57のテストでは、「2017-04-09T21:00:00」はZまたはGMT + 0000として扱われます。 Firefox 49は奇妙なことにUTCとして扱うようだが、ローカルのタイムゾーンを間違った方法で調整する。しかし、Firefox 38では、ローカルとして正しく扱われます。

したがって常には手動で文字列を解析します。ライブラリを使用するか、短い関数を書く。

// Parse 2017-04-09T11:00:00.000 as local 
 
function parseISOLocal(s) { 
 
    var b = s.split(/\D/); 
 
    return new Date(b[0], b[1]-1, b[2], (b[3]||0), 
 
       (b[4]||0), (b[5]||0), (b[6]||0)); 
 
} 
 

 
var s = '2017-04-09T21:00:00.000'; 
 
console.log('Built-in parser: ' + new Date(s).toString()); 
 
console.log('parseISOLocal : ' + parseISOLocal(s).toString());

関連する問題