2016-12-07 14 views
0

この文字列は、"November 8, 2016 - December 7, 2016"のように2つの日付をこの形式で抽出します。YYYY-MM-DD は今、私は次のようにしたい形式で日付を取得するために管理:javacriptの日付操作

HTML:

<span id="selecDate">November 8, 2016 - December 7, 2016</span>

Javascriptを:

date = $('#selecDate').text().split('-'); 
begin = new Date(date[1]); 
begin = begin.toISOString().split('T')[0]; 

問題がありますそのdate = ["November 8, 2016 ", " December 7, 2016"]

begin = "Wed Dec 07 2016 00:00:00 GMT+0200 (IST)"

2行目が最後の行にある場合、beginの値は"2016-12-06"に変わります。どのようなアイデアを避けることができますか?

私は(GMT + 02:00)から働いて、それが戻って2時間の時間を要するので、あなたが戻って取得toISOString()日付はUTC時刻である実行すると、タイムゾーン

答えて

3

を(理由あなたの現在のタイムゾーンの)。 ISTの12月6日の深夜は、前日のUTC時間の22:00です。あなたの日付オブジェクトに

ローカル時間であなたのタイムスタンプを維持したい場合は、.toLocaleDateString()を使用することができ、toLocaleString()あるいは単に.toString():日付形式が若干異なっていることを

begin = new Date('December 7, 2016').toLocaleDateString(); 

注:

a.toLocaleDateString() "12/7/2016"

a.toLocaleString() "12/7/2016, 12:00:00 AM"

a.toString() "Wed Dec 07 2016 00:00:00 GMT+0200 (IST)"

+0

必要な形式を返しているのなし。非ISO 8601文字列の解析は実装に依存し、依存するべきではありません。 – RobG

0
date = ["November 8, 2016 ", " December 7, 2016"]; 
var b = new Date(date[1]); 

//use these get methods to avoid all the confusion 
var begin = b.getFullYear()+"-"+(b.getMonth()+1)+"-"+b.getDate(); 
console.log(_begin); 
1

MDNは方法toISOString()、で述べているように:タイムゾーンは、常にゼロオフセットUTCある

そして、あなたはあなたのnew Date('December 7, 2016')を作成するとき、どのようなあなたが得ることである:

水曜日2016年12月7日00:00:00 GMT + 0200

のでUTCで、時間が2減算されていますあなたに前日を与える。

ソリューション: "2016年12月7日":

begin = begin.getFullYear() + '-' + (begin.getMonth() + 1) + '-' + begin.getDate(); 

はになります。

0

特に、動作が実装に依存するため、ECMA-262で指定されている以外の形式の場合は、文字列をDateコンストラクタで解析しないでください。

Dateオブジェクトが必要な場合は、ライブラリ(例:moment.jsfecha.js)を使用して、フォーマットを解析して日付に解析する簡単な関数を記述するか(以下を参照)。

あなただけの別の形式の文字列をしたい場合は、単に文字列を再フォーマットし、完全に日付を避ける:

// Reformat a date string in format MMMM d, yyyy to yyyy-mm-dd 
 
function reformatDate(s) { 
 
    var b = s.match(/\w+/g) || []; 
 
    var months = {jan:'01',feb:'02',mar:'03',apr:'04',may:'05',jun:'06', 
 
       jul:'07',aug:'08',sep:'09',oct:'10',nov:'11',dec:'12'}; 
 
    return b.length == 3? b[2] + '-' + 
 
     months[b[0].toLowerCase().substr(0,3)] + '-' + 
 
     ('0' + b[1]).slice(-2) : ''; 
 
} 
 

 
console.log(reformatDate('November 8, 2016')) 
 
    
 

以下の機能がMMMM dにおいて日付を解析、YYYY Dateオブジェクトの形式は、YYYY-MM-DD形式でそれをフォーマット:

// Parse date string in format MMMM d, yyyy e.g. November 8, 2016 
 
function parseDate(s) { 
 
    var months = 'jan feb mar apr may jun jul aug sep oct nov dec'.split(' '); 
 
    var b = s.match(/\w+/g) || []; 
 
    var m = months.indexOf(b[0].toLowerCase().substr(0,3)); 
 
    var d = new Date(b[2], m, b[1]); 
 
    return d && d.getMonth() == m? d : new Date(NaN); 
 
} 
 

 
function toISODate(d) { 
 
    function z(n){return (n<10?'0':'')+n} 
 
    return d.getFullYear() + '-' + z(d.getMonth()+1) + '-' + z(d.getDate()); 
 
} 
 

 
console.log(toISODate(parseDate('November 8, 2016')))
あなたがしたいmoment.jsのようなライブラリを使用して

'November 8, 2016 - December 7, 2016'.split(' - ').forEach(function(s) { 
 
    var d = moment(s,'MMMM D, YYYY').format('YYYY-MM-DD'); 
 
    console.log(d); 
 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.js"></script>