Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вывод даты. Какой способ лучше? (https://javascript.ru/forum/misc/42683-vyvod-daty-kakojj-sposob-luchshe.html)

Apollon 05.11.2013 19:59

Вывод даты. Какой способ лучше?
 
Всем привет.
Это мой второй вопрос на форуме и вторая неделя изучения JS, потому прошу не кидаться помидорами или еще чем-нибудь...
Сегодня решал следующую задачу:
Необходимо вывести на экран дату, которая будет через заданное пользователем количество дней. Количество дней, вводимое пользователем, не должно быть < 1 и > 1000, иначе вывести сообщение с ошибкой. Выведенная запись должна соответствовать образцу : "Через 20 дней будет Понедельник 25.11.2013 год". Слово "дней" должно склоняться при изменении количества введенных дней.
Решил ее способом, приведенным ниже. Однако, меня смущает количество используемых условий. Можно ли так делать? И есть ли другие способы решения?
Просьба укажите, какие методы вы использовали в решении задачи, чтобы мне было проще в них разобраться.
var day = prompt("Введите количество дней от 1 до 1000");
	function myDate (myDay) {
	var now = new Date();
	var from1970 = now.getTime();
	var res = new Date(1000*60*60*24*myDay + from1970);
	var myDays = ["Восскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"];
	var week = new Date(res);
	var dayX = res.getDate();
	var monthX = res.getMonth() + 1;
	var yearX = res.getFullYear();
	if(dayX < 10){
			var dayX = "0" + dayX;
		}
	if(monthX < 10){
		var monthX = "0" + monthX;
	}
	
	if (day < 1 || day > 1000  || isNaN(day)){
		document.write("Вы ввели не коректное число");

	}


	else if ((day[day.length - 2] == 1)  && (day[day.length - 1] ==  1)){
		document.write("Через " + day + " дней будет " + myDays[week.getDay()] + " " + dayX + "." + monthX + "." + yearX + " год");
	}

	else if (day[day.length - 1] == 1){
		document.write("Через " + day + " день будет " + myDays[week.getDay()] + " " + dayX + "." + monthX + "." + yearX + " год");
	}

	else if ((day[day.length - 2] == 1 && day[day.length - 1] == 1) || (day[day.length - 2] == 1 && day[day.length - 1] == 2) || (day[day.length - 2] == 1 && day[day.length - 1] == 3) || (day[day.length - 2] == 1 && day[day.length - 1] == 4)){
		document.write("Через " + day + " дней будет " + myDays[week.getDay()] + " " + dayX + "." + monthX + "." + yearX + " год");
	}


	else if (day[day.length - 1] == 2 || day[day.length - 1] == 3 || day[day.length - 1] == 4){
		document.write("Через " + day + " дня будет " + myDays[week.getDay()] + " " + dayX + "." + monthX + "." + yearX + " год");
	}


	else{
		document.write("Через " + day + " дней будет " + myDays[week.getDay()] + " " + dayX + "." + monthX + "." + yearX + " год");
	}
	}
	myDate(day);

рони 05.11.2013 20:23

Apollon,
функция склонения слов после цифры

Apollon 05.11.2013 20:39

Цитата:

Сообщение от рони (Сообщение 279704)

Спасибо! Попробую применить.

Apollon 06.11.2013 00:19

Если вы тоже новичок в программировании и вам интересно, что именно я нагородил в коде, то я расписал свои действия и вы можете с ними ознакомиться. Только следует учитывать, что даты выводимые объектом Date(), с учетом времени установленном на вашем ПК.
//Вывод окна с запросом для пользователя
var day = prompt("Введите количество дней от 1 до 1000");
	//создаем функцию
function myDate (myDay) {
	//Помещаем объект Date() в переменную
	var now = new Date();
	//Помещаем кол-во миллисек, прошедших с начала отсчета по сегодн число в переменную
	var from1970 = now.getTime();
	//Создаем переменную со значением равному кол-ву милесек в веденных пользователем количестве дней
	var userMyDay = 1000*60*60*24*myDay;
	//Создаем новый объект Date() для даты, равной текущей дате плюс кол-во дней выбранным пользователем
	//т.е. для той даты которая будет через кол-во дней выбранным пользователем от текущей даты (дата Х)
	var res = new Date(userMyDay + from1970);
	//Создаем массив для вывода дня недели в строковом варианте
	var myDays = ["Восскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"];
	//Помещаем объект Date() для даты Х в переменную week
	var week = new Date(res);
	//Узнаем методом getDay() число дня недели для даты Х. Это число соответсвует порядку расположения элементов в массиве myDays и, соответственно, берет из масива необходимый элемент
	var weekX = myDays[week.getDay()];
	//Узнаем методом getDate() число дня для даты Х
	var dayX = res.getDate();
	//Узнаем методом getMonth() число месяца для даты Х
	var monthX = res.getMonth() + 1;
	//Узнаем методом getFullYear() число года для даты Х
	var yearX = res.getFullYear();
	//подставляем нули для чисел < 10
	if(dayX < 10){
			var dayX = "0" + dayX;
		}
	if(monthX < 10){
		var monthX = "0" + monthX;
	}
	//Задаем услвие для ввода кол-ва дней
	if (day < 1 || day > 1000  || isNaN(day)){
		document.write("Вы ввели не коректное число");

	}

	//Тут я склонял слово "дней" (главное не путь порядок расстановки if / else). Завтра попробу сделать методом, который посоветовал ронни
	else if ((day[day.length - 2] == 1)  && (day[day.length - 1] ==  1)){
		document.write("Через " + day + " дней будет " + weekX + " " + dayX + "." + monthX + "." + yearX + " год");
	}

	else if (day[day.length - 1] == 1){
		document.write("Через " + day + " день будет " + weekX + " " + dayX + "." + monthX + "." + yearX + " год");
	}

	else if ((day[day.length - 2] == 1 && day[day.length - 1] == 1) || (day[day.length - 2] == 1 && day[day.length - 1] == 2) || (day[day.length - 2] == 1 && day[day.length - 1] == 3) || (day[day.length - 2] == 1 && day[day.length - 1] == 4)){
		document.write("Через " + day + " дней будет " + weekX + " " + dayX + "." + monthX + "." + yearX + " год");
	}


	else if (day[day.length - 1] == 2 || day[day.length - 1] == 3 || day[day.length - 1] == 4){
		document.write("Через " + day + " дня будет " + weekX + " " + dayX + "." + monthX + "." + yearX + " год");
	}


	else{
		document.write("Через " + day + " дней будет " + weekX + " " + dayX + "." + monthX + "." + yearX + " год");
	}
	}
	//Вызываем функцию с подстановкой дней, набранных пользователем
	myDate(day);

Apollon 06.11.2013 00:33

Да еще 17 строка лишняя. Можно было просто написать
var weekX = myDays[res.getDay()];

рони 06.11.2013 01:32

Apollon,:-? до первой звезды не смотреть )))
var plural = function (b) {
    return function (a) {
        return b[1 == a % 10 && 11 != a % 100 ? 0 : 2 <= a % 10 && 4 >= a % 10 && (10 > a % 100 || 20 <= a % 100) ? 1 : 2]
    }
    };
    var d = plural([' день',' дня',' дней'])

	function myDate() {
    var day = +prompt("Введите количество дней от 1 до 1000", 1)||1;
    day %= 1000;
    var now = new Date();
    now.setDate(now.getDate()+day);
    var myDays = ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"];
    alert([(new Date()).toLocaleDateString(), day+d(day), myDays[now.getDay()], now.toLocaleDateString()].join('\n'))
    }

    myDate ()

Apollon 06.11.2013 11:20

Ничего научусь. Главное практика!


Часовой пояс GMT +3, время: 02:02.