2016-09-29 18 views
2

ブラウザのJavaScriptでの日付計算の問題。 日から、何に基づいていない= 2日付計算 - 夏時間(DST)とタイムゾーンの問題 - トルコ

入力日間のJavaScript = 30/10/2016 号にカレンダーコンポーネントを使用して、選択した日から

日付日&の特許 - 3つのパラメータがあります。上記の入力ごとに計算する必要があります。開始日& "To Date"の値は01/11/2016である必要がありますが、間違った計算により31/10/2016が表示されます。

タイムゾーン - イスタンブール、トルコ

コード切り取ら用の画像の下に参照してください - それはコードから明らかなように

は、ライブラリが使用されているJavaScriptのそのプロトタイプを切り取ら。

dateUtil.prototype.addDays=function(date,noofDays) 
 
{ 
 
\t var _dateData=date.split("/"); 
 
\t var _date=eval(_dateData[0]); 
 
\t var _month=eval(_dateData[1]); 
 
\t var _year=eval(_dateData[2]); 
 
\t var newFormatedDate = new Date(""+_month+"/"+_date+"/"+_year); 
 
     var newAddedDate=newFormatedDate.getTime() + noofDays*24*60*60*1000; 
 
     var theDate = new Date(newAddedDate); 
 
     var dd = theDate.getDate(); 
 
     var mm = theDate.getMonth()+1; // 0 based 
 
     if(mm<10) 
 
      mm="0"+mm; 
 
     var yy = theDate.getYear(); 
 
     if (yy < 1000) 
 
     yy +=1900; // Y2K fix 
 
     var addedDate=""+dd+"/"+mm+"/"+yy; 
 
     
 
\t return addedDate; 
 
}

enter image description here

noofDays * 24 * 60 * 60 * 1000年のロジックは、DSTが考慮されていない問題であるようです。 同じコードで異なる日付形式の2つのタイムゾーンが表示されます。

ご指導をお願いします。

編集: JavaScriptコードが追加されました。

+3

momentjs(http://momentjs.com/docs/)を使用すると、かなり頭痛を軽減できます。時間をかけて作業することに専念した巨大な強力なライブラリです。 –

+5

関連するすべてのコードは、画像ではなく質問自体に含める必要があります。 –

+2

'Java'との衝突を避けるために' JavaScript'を正しく綴るように注意してください。 –

答えて

3

新しい千年紀に生き残ってはならないいくつかの基本的なエラーがあるので、おそらくコードを投稿する価値はありません。

var _date = eval(_dateDate[0]); 

evalのを使用しないでください。適切なケースは少数ありますが、一般的には使用しないでください。これまで上記と同じである。そして、そこにある

var _date = _dateDate[0]; 

var newFormatedDate = new Date('' + _month + '/' + _date + '/' + _year) 

あなたはそれの部分に日付文字列を分割することにより、Dateコンストラクタで解析する文字列を回避することにより、正しい軌道に乗って始めました。しかし、その後、新しい文字列を作成し、それをDateと解析することによってその良い仕事を取り消しました。

これは、日付解析のすべての不規則性を取り除き、入力することも少なくなります。また、Dateオブジェクトには書式がないため、のように名前はです。

var date = new Date(_year, _month-1, _date) 
date.setDate(date.getDate() + 2); 

だからあなたの機能が使用できます:

私は +noofDaysを使用してきました

function dateUtil(){} 
 

 
/* Add days to a date 
 
** @param {string} date - date string in dd/mm/yyyy format 
 
** @param {number} noofDays - number of days to add 
 
** @returns {Date} 
 
*/ 
 
dateUtil.prototype.addDays = function(date, noofDays) { 
 
    var dateData = date.split('/'); 
 
    var date = new Date(dateData[2], dateData[1] - 1, dateData[0]); 
 
    date.setDate(date.getDate() + +noofDays); 
 
    return date; 
 
} 
 

 
var d = new dateUtil(); 
 

 
console.log(d.addDays('23/09/2016',3).toLocaleString());

だけ日付に追加し、nは日追加するには

それが番号であることを確認してください。また、SOコンソールは、ZタイムゾーンのISO 8601文字列として日付を書き込んでいるので、toLocaleStringを使用してホストタイムゾーンに保持しています。

+0

異なる日付形式を返す.toLocaleString() - MM/DD/YYYY形式で返されるDD/MM/YYYYとSafariで返されるChrome。 2つの異なるマシンは同じクロムバージョンを持っています。 – Santosh

+0

@ Santosh- * toLocaleString *は、実装に依存する文字列を返します。この文字列は、実装ごとに異なる可能性があり、必ずしもホストの設定に注意する必要はありません。私はそれを使用したので、SOコンソールは* Date.prototype.toString *を置き換えた* Date.prototype.toISOString *を置き換えたように見えますが、これは不便です。 – RobG

関連する問題