2016-08-31 14 views
1

2017年9月1日以降の日付の間違った曜日にこの問題が発生した後、1 statemtent(setDate)のシーケンスを変更すると正しい結果が返されることがわかりました。以下のコードを参照してください。私が1.9.17(2017年9月1日)と入力すると、日曜日に変更されたコードが金曜日に取得されます。誰かが私にそれを説明できますか? FF、Chrome、Edgeで問題が発生します。Javascript Date()は特定の日付で間違った曜日を返します

<body> 
<input type="text" onchange="wday(this.value);"> 
<script> 
function wday() { 
    var x = wday.arguments[0].split("."); 
    if (x[2].length<4) x[2] += 2000; 
    var y = new Date(); 
    y.setFullYear(x[2]); 
    y.setMonth(x[1]-1); 
    y.setDate(x[0]); 
    var z = new Array("So","Mo","Di","Mi","Do","Fr","Sa"); 
    alert("wrong "+z[y.getDay()]) 
    wday2(wday.arguments) 
    } 
function wday2() { 
    var x = wday.arguments[0].split("."); 
    if (x[2].length<4) x[2] += 2000; 
    var y = new Date(); 
    y.setDate(x[0]); 
    y.setMonth(x[1]-1); 
    y.setFullYear(x[2]); 
    var z = new Array("So","Mo","Di","Mi","Do","Fr","Sa"); 
    alert("correct "+z[y.getDay()]) 
    } 
</script> 
</body> 
+0

あなたは '17'が本当に' setFullYear'の有効な入力をis'nt、あるいは少なくともそれが勝ったとして、それは – inorganik

+0

を作成しているものの日付を確認すると、私は今年賭けるだろうy'は、間違っている 'ログインする必要がありますt年を2017に設定します – adeneo

+0

https://jsfiddle.net/00mpwz97/ – adeneo

答えて

2

setMonth現在の日付が(今日は31日で、9月は30日あり)1ヶ月に設定することができますが存在しません。オーバーフローは翌月の適切な日に変わります。

> var d = new Date(); 
> d 
Wed Aug 31 2016 13:30:07 GMT-0700 (PDT) 
> d.setMonth(8); // September 
> d 
Sat Oct 01 2016 13:30:07 GMT-0700 (PDT) 

この種の問題を完全に回避するために、すべてのデータを一度に作成してください。あなたの年齢調整コードも壊れています(追加する代わりに2000を連結します)。func.argumentsを使用して引数を参照することは、実際には悪いことです。

var WEEKDAYS = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]; 

function wday(dateString) { 
    var parts = dateString.split('.'); 
    var year = parseInt(parts[2], 10); 
    var month = parseInt(parts[1], 10); 
    var day = parseInt(parts[0], 10); 

    if (parts[2].length < 4) { 
     year += 2000; 
    } 

    var date = new Date(year, month - 1, day); 

    return WEEKDAYS[date.getDay()]; 
} 

多くの機能をボーナスポイントに使用します。

const WEEKDAYS = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]; 

function parseYear(yearString) { 
    const year = parseInt(yearString, 10); 

    return yearString.length < 4 ? 
     year + 2000 : 
     year; 
} 

function parseDottedDate(dateString) { 
    const [day, month, year] = dateString.split('.'); 

    return new Date(
     parseYear(year), 
     parseInt(month, 10) - 1, 
     parseInt(day, 10) 
    ); 
} 

function wday(dateString) { 
    const date = parseDottedDate(dateString); 

    return WEEKDAYS[date.getDay()]; 
} 
+0

ありがとうございます - あなたのコードは完璧に動作します。そして+2000との混乱についてお詫び申し上げます。しかし、私はまだ明示的な数値を使用するときに同じエラーが発生する理由を理解できません: var y = new Date(); y.setFullYear(2017); y.setMonth(8); y.setDate(1); は、金曜日の代わりに日曜日を返します。 – Fritz

+0

@Fritz:変数がリテラルかリテラルかに関係なく、動作は同じです。 'setFullYear'は年を2017年に設定し、2017年8月31日の日付を設定します。' setMonth'は月を9月に設定し、9月31日に日付を設定します。 2017年ですが、9月31日はありませんので、10月1日になります。最後に、 'setDate'は日付を1stに設定しますが、すでに1stです。 – Ryan

+0

それはそうです:私は、現在の日付を初期値として持つ新しいDate()を認識していませんでした。私は通常、ドイツのウェブサイトwiki.selfhtml.orgに依存しています。最初の日付は言及していません。 もう一度ありがとう - あなたは私の一日を作った。 – Fritz

関連する問題