Формула для расчета дня на определенную дату работает хорошо, но не на определенные даты - PullRequest
0 голосов
/ 30 октября 2011

Несколько дней назад я обнаружил полезную ссылку, в которой отображается день с указанной датой.Я нашел это очень полезным для встраивания его в некоторые конкретные приложения.Это работает нормально, но в некоторые даты это не работает.Некоторые даты, в которые эта формула не работает, следующие:

(дд / мм / гггг)

1/3/1901

2/3/1901

3/3/1901

1/3/1902

2/3/1902

и т. Д. ...

Ссылка, где эта формула была реализована в Javascript, выглядит следующим образом.Просто следуйте ему и попробуйте указанные выше даты в трех текстовых полях.Он будет отображать «неопределенный», что означает, что он может быть не совсем точным для получения дня в такие даты.Какая на самом деле должна быть причина, любая идея?

Соответствующий код 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

1 Ответ

3 голосов
/ 30 октября 2011

Ну да, вы нашли ошибку в 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]);

Если вы используете сегодняшнюю дату, она будет работать, но попробуйте 1 2 1901.

Проблема в том, что при вычислении выдается -3, а -3% 7 равно -3, а при индексировании массива с -3 вы получаете неопределенное значение.

Возможно, некоторые браузеры интерпретируют отрицательный индекс массива как нечто отличное от неопределенного. Возможно, их движок JS работает как Ruby, и для рабочих дней [-3] они считаются с правильного конца, потому что в конце концов 1 февраля 1901 года действительно было пятницей!

Опять же, кто-то опубликовал в Интернете какой-то плохой код! Обязательная ссылка xkcd!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...