2011-10-29 14 views
0

数日前、特定の日付の日が表示される便利なリンクが見つかりました。私はそれをいくつかの特定のアプリケーションに埋め込むのに非常に便利だと分かった。それはうまく動作しますが、一部の日付では動作しません。この式が機能しない日付の一部は次のとおりです。特定の日付の日を計算するための公式は正常に動作しますが、特定の日付では動作しません

(DD/MM/YYYY)

1901年1月3日

1901年2月3日

1901年3月3日

1902年1月3日

2/3/1902

など...

この式がJavascriptで実装されたリンクは次のとおりです。それに従い、与えられた3つのテキストフィールドで上記の日付を試してください。 「未定義」と表示されるのは、その日にその日を取得するために特定されないことを意味します。何が実際に何の理由であるべきですか?

関連するJavaScriptコードは次のとおりです。

var monthCodes = Array(5,1,1,4,6,2,4,0,3,5,1,3); 
var weekdays = Array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'); 
function compute() { 
    d = conversion.day.value; 
    m = conversion.month.value; 
    y = conversion.year.value%100; 
    c = Math.floor(conversion.year.value/100); 
    if((conversion.year.value%4==0) && (conversion.year.value%100!=0 || conversion.year.value%400==0) && (m==1 || m==2)) 
     isLeapJanFeb = 1; 
    else 
     isLeapJanFeb = 0; 
    weekday = (1*d + 1*monthCodes[m-1] + 1*y + 1*Math.floor(y/4) - 2*(c%4) - 1*isLeapJanFeb) % 7; 
    alert(weekdays[weekday]); 
} 

注それがInternet Explorerで正常に動作していること。 Mozilla Firefoxなどの一部のブラウザでは、動作しないことがあります。ここで

がリンクである...

http://katzentier.de/_misc/perpetual_calendar.htm

答えて

3

はまあはい、あなたはJavaScriptでバグを発見しました。

私はビューソースを作成してそれをフィドルにコピーしましたが、JSFiddleは現在ダウンしているようです。ここでは、コードは次のようになります。

var monthCodes = Array(5,1,1,4,6,2,4,0,3,5,1,3); 
var weekdays =['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']; 
var d = +prompt("Day"); 
var m = +prompt("Month"); 
var year = +prompt("Year"); 
var y = year%100; 
var c = Math.floor(year/100); 
if ((year%4==0) && (year%100!=0 || year%400==0) && (m==1 || m==2)) 
    isLeapJanFeb = 1; 
else 
    isLeapJanFeb = 0; 
weekday = Math.floor(1*d + 1*monthCodes[m-1] + 1*y + 1*Math.floor(y/4) - 2*(c%4) - 1*isLeapJanFeb) % 7; 
alert("Weekday code computed to be " + weekday); 
alert("The weekday is " + weekdays[weekday]); 

あなたは今日の日付を使用する場合、それは動作しますが、問題は-3計算が与えられるということで、-3%7は-3 1 2 1901

をしようとします-3で配列をインデックス化すると、未定義になります。

一部のブラウザでは、負の配列インデックスがundefined以外のものとして解釈されることがあります。おそらく彼らのJSエンジンはRubyのように動作し、平日の[-3]彼らは右端から数えています。なぜなら、の2月1日は確かに金曜日だったからです!

もう一度、誰かがインターネットに悪質なコードを投稿しました。 Obligatory xkcd reference!