2016-01-30 4 views
3

Функция Javascript работает, но сообщает о неправильном дне недели. В некоторые дни это работает, но некоторые нет. Например, 22 января 1991 г. отчетность поступает корректно, так как в апреле, но 04 апреля 1994 года, неверно. Как это фиксируется?Функция имени Javascript возвращает неправильный день недели

Также как реализовать условие, которое возвращает «Вы из будущего ?!» если пользователь предоставляет дату в будущем.

Вот моя функция до сих пор.

//ask user for birthday 
var birthday = window.prompt("What is your birthday? (MM-DD-YYYY)", ""); 
var birthdayArray = birthday.split('-'); 
//validate entry is correct 
if(birthdayArray.length !==3){ 
    alert("invalid date") 
} 
//validate if date format is correct 
else{ 
    if(!birthdayArray[0].match(/^\d\d$/) || 
     !birthdayArray[1].match(/^\d\d$/) || 
     !birthdayArray[2].match(/^\d\d\d\d$/)){ 
     alert("invalid date"); 
    } 
///take user input and find weekday 
    else{var weekDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday','Friday', 'Saturday']; 
    var userDate = new Date(
     parseInt(birthdayArray[0])-1, 
     parseInt(birthdayArray[1])-2, 
     parseInt(birthdayArray[2]) 
    ); 
    var result = userDate.getDay(); 
    var dayName = weekDays[result]; 
    document.write("You were born on "+dayName); 
} 
} 

Можно ли это сделать без полного повторного ввода кода?

РЕДАКТИРОВАТЬ: 1 и -2 были мной, играющими вокруг с фиксированными датами, надеясь, что я смогу найти золотую комбинацию, до сих пор ничего.

+4

любезно рассмотреть чтение [документация] (https: //developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date) – njzk2

+0

Убедитесь, что вы используете 'parseInt (Val, 10)', в противном случае значения, такие как '08' и' 09', будут проанализированы так, как если бы они были базовыми 8 , Кроме того, конструктор 'Date' занимает год-месяц-день, а не месяц-день-год. – Krease

+0

@ Chris-parseInt вовсе не требуется. Если в конструктор [* Дата * *] добавлено более одного значения (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-date-year-month-date-hours- минут-секунд-мс), они все равно преобразуются в число. – RobG

ответ

4

Потому что это в обратном направлении. Дата Конструктор выглядит как-

new Date(year, month, day); 

Вы doing-

new Date(month, day, year); 

Так что вместо этого следует Бе

var userDate = new Date(
     parseInt(birthdayArray[2]), 
     parseInt(birthdayArray[0])-1, // dates in javascript start counting at 0 
     parseInt(birthdayArray[1]) 
    ); 
+0

Обязательно используйте 'parseInt (значение, 10)' для правильного разбора '08' и' 09' – Krease

+1

@ Крис Я не думаю, что это необходимо. Могли бы вы объяснить? –

+0

Некоторые браузеры все еще анализируют строки, начиная с 0 как восьмеричные, а не десятичные. См. [This] (http://stackoverflow.com/questions/3446805/parseint-returning-incorrect-value-dob-validation), связанный с этим вопрос для получения более подробной информации. – Krease

0

Тот факт, что код сообщает правильный день недели для некоторых дат просто совпадение. Вы используете месяц как год, день как месяц и год как день.

Своп значения вокруг так, что вы получите за год, месяц, день для того, что Date конструктор ожидает:

var userDate = new Date(
    parseInt(birthdayArray[2], 10), 
    parseInt(birthdayArray[0], 10)-1, 
    parseInt(birthdayArray[1], 10) 
); 

Кроме того, parseInt принимает второй параметр, который является основой, что особенно важно укажите, когда вы обрабатываете значения с начальным нулем, поскольку по умолчанию они интерпретируются как база 8.

+0

Argh, должен был это осознать. Когда я переключаю эти значения вокруг, должен ли я хранить изменения -1, -2? или это уже не понадобится? –

+0

Как это отличается от того, что я сказал? –

+0

Почему вы сохранили '-1' и' -2'? Это не кажется правильным ... – Krease

3

Почему бы не использовать Moment.js?

Взгляните на этом примере кода:

var date = moment("2016-01-31"); 
var weekDayNumber = date.day(); // Return the number of dayweek (0 in this case) 
if (weekDayNumber === 0){console.log("Born Sunday");} 
else if(weekDayNumber === 1){console.log("Born Monday");} 
+0

Я не могу использовать Moment.js, потому что это школьное задание, и его вид требует грубо использовать только обычный Javascript. –

+0

Bummer. Я люблю MomentJS –

+0

Поверьте мне, посмотрев Moment.js, я обязательно буду использовать его в своих проектах! –

0

Поскольку вы уже подтверждено, что пользователь ввел дату в виде MM-DD-YYYY, вы можете изменить это

var userDate = new Date(
    parseInt(birthdayArray[0])-1, 
    parseInt(birthdayArray[1])-2, 
    parseInt(birthdayArray[2]) 
); 

к этому

var userDate = new Date(birthday); 

Контрольный код:

var weekDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday','Friday', 'Saturday']; 
 
var d = new Date("04-04-1994"); 
 
document.writeln("DATE: " + d + "<br>"); 
 
document.writeln("DAY OF THE WEEK: " + d.getDay() + "<br>"); 
 
var dayName = weekDays[d.getDay()]; 
 
document.write("You were born on "+dayName);

Отказ от ответственности: работает только в браузерах ожидавших формат даты будет MM-DD-YYYY

+0

Это работает только в том случае, если браузер ожидает дату в формате MM-DD-YYYY. Например, мой браузер ожидает дату в формате YYYY-MM-DD. – Guffa

+0

@ Guffa Спасибо за разъяснение. Я обновлю ответ с этим отказом. –

+1

[полагаться на конструктор даты (String) javascript для «делать правильную вещь» является опасным (зависит от реализации браузера) и никогда не следует рекомендовать из-за его несоответствий.] (Http://stackoverflow.com/a/2488358/ 836214) – Krease

Смежные вопросы