Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   if – else if – else (https://javascript.ru/forum/misc/76955-if-%E2%80%93-else-if-%E2%80%93-else.html)

Besprizornik 05.03.2019 09:06

if – else if – else
 
Есть строка

d = new Date(new Date()-X*24*60*60*1000);

где X это числом и может быть от 10 до 15, я понимаю что тут надо применить конструкцию if – else if – else, кто нибудь может объяснить на словах что сейчас нужно сделать, создать функцию? или массив? или переменную? или ещё что?

я попытался через операторы отобразить при каких условиях чему равно Х

if (10==>=new Date(1582,9,15)&&<=new Date(1700,02,11))
else if (11==>=new Date(1700,02,12)&&<=new Date(1800,02,12))
else if (12==>=new Date(1800,02,13)&&<=new Date(1900,02,13))
else if (13==>=new Date(1900,02,14)&&<=new Date(2100,02,14))
else if (14==>=new Date(2100,02,15)&&<=new Date(2200,02,15))
else (15==>=Date(2200,02,16)&&<=Date(2300,02,16))


просто на словах объясните что сейчас делать, что читать и что искать...

Nexus 05.03.2019 09:35

Цитата:

Сообщение от Besprizornik
попытался через операторы отобразить при каких условиях чему равно Х

По-моему у вас не вышло, попробуйте словами.

Besprizornik 05.03.2019 09:50

Х равно 10 если >=new Date(1582,9,15)&&<=new Date(1700,02,11))
Х равно 11 если >=new Date(1700,02,12)&&<=new Date(1800,02,12)
Х равно 12 если >=new Date(1800,02,13)&&<=new Date(1900,02,13)
Х равно 13 если >=new Date(1900,02,14)&&<=new Date(2100,02,14)
Х равно 14 если >=new Date(2100,02,15)&&<=new Date(2200,02,15)
Х равно 15 если >=Date(2200,02,16)&&<=Date(2300,02,16)

Besprizornik 05.03.2019 10:04

<table border="1">
<tr><td>Кол-во дней</td><td>период чч.мм.гггг – чч.мм.гггг</td></tr><tr><td>10</td><td>15.10.1582 — 11.03.1700</td></tr>
<tr><td>11</td><td>12.03.1700 — 12.03.1800</td></tr>
<tr><td>12</td><td>13.03.1800 — 13.03.1900</td></tr>
<tr><td>13</td><td>14.03.1900 — 14.03.2100</td></tr>
<tr><td>14</td><td>15.03.2100 — 15.03.2200</td></tr><tr><td>15</td><td>16.03.2200 — 16.03.2300</td></tr></table>

NeoN 05.03.2019 10:16

возможно, вы хотели что-то вроде этого:

var x;
var someDate=new Date(1600,1,9); //произвольная дата
if (someDate>=new Date(1582,9,15)&&someDate<=new Date(1700,02,11)) x = 10;
else if (someDate>=new Date(1700,02,12)&&someDate<=new Date(1800,02,12)) x = 11;
else if (someDate>=new Date(1800,02,13)&&someDate<=new Date(1900,02,13)) x = 12;
else if (someDate>=new Date(1900,02,14)&&someDate<=new Date(2100,02,14)) x = 13;
else if (someDate>=new Date(2100,02,15)&&someDate<=new Date(2200,02,15)) x = 14;
else if (someDate>=new Date(2200,02,16)&&someDate<=new Date(2300,02,16)) x = 15;

Nexus 05.03.2019 10:19

Я бы как-то так сделал:
(()=>{
    const currentTime=new Date().getTime();//текущее время (unix time)
    //Отсортированный список временных интервалов. 
    //Наименование свойства объекта - число, которое будет возвращено,
    //если текущее время попадает в заданный интервал.
    //Во вложенных массивах указываются аргументы, которые будут переданы конструктору Date
    const ranges={
        10:[[1582,9,15],[1700,02,11]],
        11:[[1700,02,12],[1800,02,12]]
    };
	
    //Поиск только тех интервалов, в которые входит текущее время
	return Object.keys(ranges).filter(day=>{
        //Приведение границ интервала к типу int
		const range=ranges[day].map(
			args=>new Date(...args).getTime()
		);
		
        //Сравнение текущего времени и границ интервала
		return (
			currentTime>=range[0] && currentTime<=range[1]
		);
	}).shift()||0;//Возвращение первого подходящего ключа, либо 0
})();

Besprizornik 05.03.2019 10:31

а можно чуть подробнее?
я только пытаюсь учиться ...

хочу вставить в этот скрипт
<script> 
var d = new Date(); 
document.addEventListener('DOMContentLoaded', function() { 
document.querySelector('#day_gr').options[d.getDay()||7].selected = true;
document.querySelector('#date_gr').options[d.getDate()].selected = true;
document.querySelector('#month_gr').options[d.getMonth()+1].selected = true;
document.querySelector('#year_gr').value = d.getFullYear();
document.querySelector('#day_ul').options[d.getDay()||7].selected = true;
d = new Date(new Date()-13*24*60*60*1000);
document.querySelector('#date_ul').options[d.getDate()].selected = true;
document.querySelector('#month_ul').options[d.getMonth()+1].selected = true;
document.querySelector('#year_ul').value = d.getFullYear();
});
</script>

Besprizornik 05.03.2019 10:34

в 9 строчке что бы отнималось разное количество дней...

NeoN 05.03.2019 10:41

разное количество дней зависит от выбранного периода ведь?
тогда нужно еще откуда то брать время, по которому определить вычитаемое количество дней

Nexus 05.03.2019 10:48

Besprizornik, обратите внимание на const, стрелочные функции и spread-оператор, они не поддерживаются старыми браузерами.

var x=(()=>{
    const currentTime=new Date().getTime();
    const ranges={
        10:[[1582,9,15],[1700,02,11]],
        11:[[1700,02,12],[1800,02,12]]
    };
	
	return Object.keys(ranges).filter(day=>{
		const range=ranges[day].map(
			args=>new Date(...args).getTime()
		);
		
		return (
			currentTime>=range[0] && currentTime<=range[1]
		);
	}).shift()||0;
})();

var d = new Date(); 
document.addEventListener('DOMContentLoaded', function() { 
	document.querySelector('#day_gr').options[d.getDay()||7].selected = true;
	document.querySelector('#date_gr').options[d.getDate()].selected = true;
	document.querySelector('#month_gr').options[d.getMonth()+1].selected = true;
	document.querySelector('#year_gr').value = d.getFullYear();
	document.querySelector('#day_ul').options[d.getDay()||7].selected = true;
	
	d = new Date(new Date()-x*24*60*60*1000);
	document.querySelector('#date_ul').options[d.getDate()].selected = true;
	document.querySelector('#month_ul').options[d.getMonth()+1].selected = true;
	document.querySelector('#year_ul').value = d.getFullYear();
});

Besprizornik 05.03.2019 10:52

Цитата:

Сообщение от NeoN (Сообщение 504377)
возможно, вы хотели что-то вроде этого:

var x;
var someDate=new Date(1600,1,9); //произвольная дата

насколько я понимаю var x; это переменная и её надо вставить вместо цифры 13 ?

что такое var someDate=new Date(1600,1,9); //произвольная дата и зачем?

Besprizornik 05.03.2019 11:02

Цитата:

Сообщение от NeoN (Сообщение 504381)
разное количество дней зависит от выбранного периода ведь?
тогда нужно еще откуда то брать время, по которому определить вычитаемое количество дней

как бы есть конкретная дата введённая посетителем, она попадает в var d = new Data(сюда) из этой даты вычитается определённое количество дней согласно таблице...

NeoN 05.03.2019 11:04

еще как вариант

function epoDet(y=2019,m=3,d=5){ 
	var date = new Date(y,m-1,d);
	let epar = [];
	epar[10] = [[1582,9,15],[1700,2,11]];
	epar[11] = [[1700,2,12],[1800,2,12]];
	epar[12] = [[1800,2,13],[1900,2,13]];
	epar[13] = [[1900,2,14],[2100,2,14]];
	epar[14] = [[2100,2,15],[2200,2,15]];
	epar[15] = [[2200,2,16],[2300,2,16]];
	return epar.findIndex(range=>range?date>=new Date(...range[0])&&date<=new Date(...range[1]):'');
}

var d = new Date(); 
document.addEventListener('DOMContentLoaded', function() { 
	document.querySelector('#day_gr').options[d.getDay()||7].selected = true;
	document.querySelector('#date_gr').options[d.getDate()].selected = true;
	document.querySelector('#month_gr').options[d.getMonth()+1].selected = true;
	document.querySelector('#year_gr').value = d.getFullYear();
	document.querySelector('#day_ul').options[d.getDay()||7].selected = true;
	//y,m,d - год, месяц, день вычисляемой даты
	d = new Date(new Date()-epoDet(y,m,d)*24*60*60*1000);
	document.querySelector('#date_ul').options[d.getDate()].selected = true;
	document.querySelector('#month_ul').options[d.getMonth()+1].selected = true;
	document.querySelector('#year_ul').value = d.getFullYear();
});


в таком случае в y,m,d надо вписать год, месяц день даты введенной посетителем

Besprizornik 05.03.2019 11:33

объясните По русски не что к чему

Цитата:

Сообщение от Besprizornik (Сообщение 504372)
кто нибудь может объяснить на словах что сейчас нужно сделать, создать функцию? или массив? или переменную? или ещё что?


просто на словах объясните что сейчас делать, что читать и что искать...


NeoN 05.03.2019 11:45

Цитата:

Сообщение от Besprizornik (Сообщение 504386)
объясните По русски не что к чему

объясните хотя бы алгоритм работы вашей программы...
сейчас пока можно только догадываться :)

Besprizornik 05.03.2019 11:59

есть дата, по умолчанию сегодняшняя, мы пользуемся григорианским календарём, 'вторая' в кавычках дата, это сегодняшняя дата по юлианскому календарю(старый стиль)...

Nexus 05.03.2019 12:04

Besprizornik, не могу понять, что вам нужно.
Как избавится от Индусского кода и получить вожделенное значение я показал, что еще нужно?

Besprizornik 05.03.2019 12:13

Nexus,
всего лишь краткие комментарии, чисто в двух словах, что бы я с помощью гугла смог понять что к чему...

NeoN 05.03.2019 12:16

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

Nexus 05.03.2019 12:18

Цитата:

Сообщение от Besprizornik
всего лишь краткие комментарии

краткие комментарии того, что делает код?

Besprizornik 05.03.2019 12:45

Цитата:

Сообщение от Nexus (Сообщение 504392)
краткие комментарии того, что делает код?

ага...

Besprizornik 05.03.2019 13:01

Neon, а разве строчка d = new Date(new Date()-raznica*24*60*60*1000); не высчитывает разницу между каледарями? где raznica это переменная переименованная мною из ваших вариантов вместо 'х'...

laimas 05.03.2019 13:03

Besprizornik, вы так и не остановились на том, что я вам повторял дважды - подумать чего не хватает в вашей программе. Вместо этого, судя по коду здесь, вы упорно продолжаете использовать пустые опции никчемные для вашей программы.

А ведь не в каждом месяце по 31 дню, более того, количество дней февраля зависит от года. При этом, если объекту Date передать 31 число для месяца в котором всего 30 дней, то ошибки не будет, просто объект вернет 1 число следующего месяца. Но ведь пользователь получит совсем не то чего ожидает.

А значит сначала нужно выбросить лишние никчемные опции, и вместо этого добавить управление либо доступа, либо скрывать/показывать тем опциям, которые действительно в этом нуждаются. Если выбран месяц в списке, а число в списке дней более количества дней этого месяца, то выбрать в нем последнее число выбранного месяца, а большие скрыть или сделать недоступными для выбора. Для февраля еще и с учетом года. Ну или какой-то иной механизм, но должен быть.

А уж потом все остальное.

Besprizornik 05.03.2019 13:12

laimas,
пока вопрос стоял о вычитания правильного количества дней согласно таблице, взятой из википедии

Besprizornik 05.03.2019 13:23

плюс на экране отображается дата По обоим календарям и если объект добавил лишний день из следующего месяца то видно на экране, что первому числу соответствует 1 минус 13 ,а не 30 минус 13

laimas 05.03.2019 13:28

Цитата:

Сообщение от Besprizornik
пока вопрос стоял о вычитания правильного количества дней согласно таблице

Цитата:

Сообщение от Besprizornik
плюс на экране отображается дата По обоим календарям и если объект добавил лишний день из следующего месяца

Каком экране? У вас список как был с выбранным числом так и остался. Если отмотать "пленку" назад и говорить о получении дня недели, то получается полная профанация.

Впрочем, дело хозяйское, что хотите, то и делайте.

Besprizornik 05.03.2019 13:41

laimas,
я понял что надо вместо -13 создать переменную, в которой хранится количество дней, и как менять это количество в зависимости от периода... или я что-то не так понял?

Nexus 05.03.2019 13:47

Besprizornik, я добавил комментарии к своему коду, смотрите пост №6.

Я только сейчас обратил внимание, что у вас используются даты, выходящие за границы т.н. эпохи unix.
Не могу гарантировать, что класс Date будет работать корректно.

laimas 05.03.2019 14:33

Цитата:

Сообщение от Besprizornik
я понял что надо вместо -13 создать переменную

13 чего, опции? Вам вообще они не нужны. Но у вас странная логика - показать день недели, это просто вывод значения из определенного массива, индексом которого будет полученный день недели. По вашей же логике это не имеет значения и можно городить костыли со списком в котором куча опций, доступностью которых нужно управлять.

Лишние опции в списках месяцев и дней недели вообще лишний балласт, вы это оправдываете показом какой-то пустой даты.

Коли мне предоставляется возможность выбрать дату, информация по которой меня интересует, то я не должен догадываться почему она изменилась на каком-то экране, о котором вы говорите. Это я как разработчик могу знать как поступит объект Date при вводе некорректной даты, а пользователи что тоже все поголовно программисты и в курсе этого? Наверное же это не их проблемы, а ваши, вы должны предусмотреть все чтобы исключить человеческий фактор при выборе даты.

Но у вас же своя логика по данному вопросу, для меня непонятная, а если я не понимаю, то и сказать ничего не могу. ;)

Делайте как считаете нужным, мне то в общем все равно. :)

Besprizornik 05.03.2019 15:35

laimas,
скрыть 31 число? и заставить пользователя сначала ввести месяц...
это мне кажется не выход...
правильным вариантом мне представляеться отслеживать что ввёл пользователь и после ввода пары число месяц или если введена пара год и что еще, тогда после нажатия на кнопку выводить всплывающее окно с инфой мол в этом месяце столько то дней, введите правильную дату...

laimas 05.03.2019 16:04

Besprizornik, приводить количество дней месяца к текущему месяцу не есть проблема, просто вы не знаете как это делается, а проверять то все равно придется.

Предупреждайте, делайте как знаете, мне в общем то без разницы. :)

Besprizornik 05.03.2019 16:38

laimas,
в зачем приводить количество дней к текущему месяцу в форме для ввода/выбора? чтобы показать пользователю сколько дней в месяце и тем самым заставить перейти к выбору месяца а потом опять вернуться к выбору числа и добавить ему лишней мороки?

тогда правильнее будет селект для числа заменить на поле ввода...

laimas 05.03.2019 17:00

Besprizornik, у вас какая-то логика не понять. :)

Если бы было нечто, что само по себе догадалось, что дата некорректная и раз alert("Ты че?"), это было бы без затратным решением. Но такого нет, для того чтобы сообщить что есть ошибка, нужно все проверить и выдать сообщение. То есть хотите вы того или нет, вы обязаны каждый ввод проверять.

А можно и не чего не сообщать пользователю, а молча исправлять его ошибки ввода, а они неизбежно будут, коли ему предоставляется лишнее. Тем более что ошибка только тогда возникает, когда выбран день больше максимального, а значит исправить его молча на действительно максимальный для текущего месяца (тот что в списке месяцев), это будет вполне правильное действие.

Оба этих подхода вынуждены будут выполнять одни и те же действия, только первый пугает сообщением, а второй исправляет ошибки.

У меня нет времени чтобы писать подробности, но список дат можно формировать динамически, можно прятать лишние дни, можно блокировать доступ к лишним дням. Все это решения, но они вас просто пугают, либо вы не понимаете о чем речь.

А в свете зоопарка разных браузеров и их особых взглядов на жизнь и не знание вами этой проблемы, и при решении их посредством jQuery, такое динамическое исправление написать совсем просто.

Besprizornik 05.03.2019 23:19

laimas,
что непонятного в моей логике?
объясни мне такую вещь, ну привели мы количество дней к текущему месяцу, допустим февраль-28, и что получилось?
приблизительно ситуация выглядит так посетитель нажал на селект с числом и видит 28 опций, он хочет ввести 31 марта, но не может этого сделать из-за отсутствия 31ой опции, ему придётся перейти к селекту с выбором месяца а потом вернуться к выбору числа, или есть какие то варианты прочесть мысли посетителя и в нужный для него момент показать 30 опцию для ввода 30 апреля а в тот момент когда он захочет ввести 31 мая добавить 30ую и 31ую опции

логика проста – если нельзя предугадать действия посетителя, то или не прятать лишние опции - не есть айс, или же убрать возможность выбора заменив на возможность ввода...

laimas 06.03.2019 02:59

Я уже говорил - поступайте как считаете нужным. А это мой последний комментарий в этой теме, и сейчас есть немного времени, и если это будет полезно, то можно и пояснить что.

Хорошо, примем понятие "логика" как понятие философское, ну или по вкусу, как кому нравится. Но сначала давайте вообще о понятии дата/время.

Вы в своей программе вы вряд ли даже станете задумываться над тем, что это такое вообще. Да, вы держите в уме два календаря, но только лишь всего. А между тем, дата/время это особенный тип данных, имеет множество представлений и может возвращаться в разных языках программирования величиной соответствующей контексту запроса. Время измеряется в количестве секунд прошедших с полуночи 1 января 1970 года по UTC (начало эпохи Unix). В Javascript это значение измеряется в миллисекундах, то есть помноженное на 1000.

Есть одна особенность объекта Date, его можно вызвать как функцию, без оператора new, и это всегда будет возвращать строку о текущей дате и времени:
alert(Date())


Но вызов объекта и как конструктора таким же образом выведет тоже самое:

1)
alert(new Date())


А теперь фокус:

2)
alert(new Date()*2)


А вот так будет неудача:

3)
alert(Date()*2)


А вот так добавим 30 дней:

4)
alert(new Date() + 1000 * 60 * 60 * 24 * 30)


Причем это будет работать даже если мы вызовем объекта как функцию, в отличии от 3):

5)
alert(Date() + 1000 * 60 * 60 * 24 * 30)


Интересно да? Все потому, что "внутри" объект понимает и знает этот тип данных во всех его деталях, и соответственно реагирует на запросы. То есть ему не составит труда исправить "ошибку". Но нужно все-таки оговорится - если вы привыкните к этому и будет думать, что это закономерность, то вас вполне может ожидать неприятный сюрприз.

Коли вы уж впряглись в веб программирование, то вполне можете оказаться и по другую сторону баррикады - на сервере. В зависимости от языка программирования на сервере, функций для работы с этим типом данных может быть различное множество, например их масса в РНР, есть готовые функции календаря для перевода дат из одного формата в другой. Основой этого календаря является исчисление с Юлианского дня.

А вот работая с базой данных, которая конечно же, также должна уметь работать с датой временем, вы столкнетесь с различным ее представлением в базе - типом. В контексте что вас "может ожидать сюрприз" возьмем тип TIMESTAMP. Этот тип есть временная метка в секундах, то есть тоже что и возвращает объект Date(), но в секундах. То есть внутренне представление этого типа, это число от 00000000000000 до макс. значения с которым может оперировать системное время (была когда-то острая проблема - начало нового тысячилетия).

И также как в JS, просто выборка даты из поля этого формата вернет строковое представление даты. Но мы то знаем, что внутреннем представление, это число. Но тем не менее, чтобы получить эту дату как метку времени, нужно явно указать в запросе это функцией UNIX_TIMESTAM(). В тоже время, SQL как и многие языки, в том числе и Javascript могут налету преобразовать один тип данных в другой. А кроме этого, SQL имеет и иные типы данных, которые являясь строковыми, во внутреннем представлении являются числами. Это типы ENUM и SET, которые по аналогии можно для простоты сравнить со списками, где первый тип, это список с одиночным выбором или связанная группа радиокнопок, а второй список с множественным выбором или набор флажков. Если тот и второй тип равен "первый,второй,третий", то запрос значения как есть вернет строковое значение - для первого одно из трех, что установлено, а для второго набор который установлен. Но если при запросе к полю имени прибавлять 0, то для первого вернет значение от 1 до 3, соответствующее установленному значению, а для второго битовый набор. И при вставке/выборке можно оперировать числами, а SQL все корректно сделает.

А как же с TIMESTAMP, о котором мы знаем, что внутренне представление этого типа тоже число? А вот так. Допустим есть в SQL функция BETWEEN, она позволяет описать проще выборку по условию A >= N AND B <= M. Если в запросе написать - BETWEEN N AND M, даже если в качестве N и M, мы укажем корректные метки времени, то запрос ничего не вернет. Казалось бы, все соответствует и должно, но тем не менее и тут нужно указывать явно что мы хотим, то есть BETWEEN FROM_UNIXTIME(N) AND FROM_UNIXTIME(M). Казусы могут быть и в JS, тут еще и браузеры различные свою лепту вносить в раздрай будут.

А теперь еще об одном касающегося типа дата/время, которое представлено строкой, хотя это не связано с тем, что это именно дата/время. Тем не менее - нельзя сравнивать даты как строковые значения, если дата не представлена в европейском формате, то есть "YYYY-MM-DD". Результат сравнения будет неверным, это следствие сравнения строк, содержащих в себе как цифровые, так и не цифровые символы. Что нужно отметить в этом случае, при сравнении строковых значений дат, то что возвращение верного результата сравнения дат при европейском формате обуславливается тем, что дата записана ее элементами от старшего (года) до младшего (дня). Это мы пока держим в уме.

В общем тип данных дата/время многогранен, вам как разработчику и нужно, и полезно знать такие вещи. Но только вам, пользователю они и не нужны, да и неинтересны. Их может заинтересовать только история этого типа данных, которая очень богата - почему в месяцах по 30 и 31 день, а в августе и сентябре по 31, а в феврале вообще то 28, то 29, календари и т.д. Вся кухня программная скрыта от пользователя, но...

Знание всего и вся об этом типе, это еще не решение задачи вашей, а вы ведь не просто будете получать даты, оперировать ими, складывая, вычитая, сравнивая. Вы пишите приложение, а любое приложение базируется на логике, которая описывает поставленную задачу. В свою очередь логика, это программные блоки, которые содержат (описывают) определенные алгоритмы. Любую логику приложения можно представить в виде блок-схемы.

Обычный календарь можно тоже представить в виде блок схемы и она будет довольно таки внушительной. Но в такой блок схеме явно будут определенные области, описывающие ту или иную частную задачу как часть общей.

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

Вот приложение календарь:

<input type="date" />


Его интерфейс при своей простоте удобен для пользователя, интуитивно понятен, выбор элементов управления есть предсказуемый результат, не позволяет ошибок при управлении через элементы управления. А ручной ввод не позволяет выбрать в нем введенную некорректную дату. Попробуйте найти в нем в текущем месяце день 31 марта чтобы выбрать его. Этого нет, ибо это нелогично, а значит и интерфейс приложения автоматически предоставляет пользователю дни только текущего месяца. Для выбора диапазона дат служат сдвоенные календари или календари имеющие такую функцию.

А теперь извлечем из памяти европейское строковое представление даты. Как уже говорилось, корректность сравнения дат в строковом представлении европейского формата в представлении ее от старшинства элементов даты. Так и в календаре, если нужно выбрать март 31, то сначала нужно выбрать месяц март, и это вполне естественное действие к которому все привыкли. Это естественное и заложено в логику приложения, которое обеспечивает подобающий этой логике интерфейс. Разработчики этого приложения как раз ориентировались на предсказуемость поведения пользователя, а единственная возможная непредсказуемость, которая может возникнуть при ручном вводе даты, блокируется приложением. И заметьте, без сообщений, просто отмечая окно ввода красным, что уже дает понять о наличии ошибки, а при вводе корректной даты она будет выбрана в календаре.

laimas 06.03.2019 03:06

А что у вас представляет интерфейс. В общем ничего, его нет как такового, если учитывать его составляющие. В вашем приложении данные типа дата живут своей жизнью, а элементы управления своей. Текущая дата не обязательно соответствует набору элементов управления. Вы как бы переложили решение всех проблем на плечи пользователя. О каком удобстве и предсказуемости можно говорить в этом случае?

Ну допустим, ваш интерфейс, это по принципу "максимум возможного - кашу маслом не испортишь". А вы задавались вопросом - все ли наизусть помнят сколько дней в каком месяце? Если пользователь видит 31, а на самом деле в этом месяце всего 30 дней, то вправе ли он верить вам, что в этом месяце действительно 31 день? А если так, то это предпосылка к ошибочному действию пользователя, и эту предпосылку заложили вы и в логику своего приложения, и в ее интерфейс. Хотите сообщать пользователю о таких ошибках? А зачем их создавать, где же логика?

Ну допустим, все знают дедовский метод определения дней месяцев по косточкам пальцев. И пусть это, заставляющее пользователя перед выбором обращать взор на свой кулак, и уже говорящее о необдуманности логики и интерфейса приложения, примем как за фишку приложения, пусть смотрит на кулак, узнает сколько дней в месяце, а затем выбирает нужный последний день. Но встает вопрос о феврале - а сколько же в нем дней в текущем году? Разделить по модулю 4 текущий год? Многие уже умножать в уме разучились, а что такое деление по модулю и тем паче не знают. Но это еще пол беды, а беда в том, что високосные года, это не просто только те, что делятся на 4 без остатка, но также не делящиеся на 100, за исключением годов делящихся на 400. Нихилая математика для пользователя, не так ли?

Говоря об интерфейсе вашего приложения, нужно скорее говорить о непредсказуемости его, а не пользователей. Об удобстве пользования им и ожидаемом поведении вообще не приходиться говорить, это вообще отсутствует.

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

Но это мое мнение, вы же можете поступать как считаете нужным, задачи переубедить вас в чем-то у меня нет, и писать более, а тем более много, у меня времени уже не будет. :)

Besprizornik 06.03.2019 05:31

laimas,
ну первое что я могу сказать, ещё раз спасибо, много нужного и полезного для меня ты изложил причём очень подробно, я конечно же учту в будущем..

второе, отступлю от темы и приведу пример из жизни, года полтора назад я оказался очевидцем, как мама учила писать и читать свою дочь-дошкольницу, вопрос это какая буква, ответ 'эн', а это какая, ответ 'а' а вместе, ответ 'незнаю', запомни 'на', потом с минуту вопросы по другим буквам алфавита, ответы правильные, дошли до 'н' потом 'а' вопрос а вместе, ответ 'незнаю' сцена продолжается минут 15-20 с одинаковым результатом...
наивно ведь полагать что первоклашка напишет сочинение для старших классов хотя бы на оценку 'удовлетворительно' и тем более уложится в 45 мин урока...

всему свое время, а теперь давай вернемся к первому посту темы...

Besprizornik 06.03.2019 05:34

вот цитата

Цитата:

Сообщение от Besprizornik (Сообщение 504372)
Есть строка

d = new Date(new Date()-X*24*60*60*1000);

где X это числом и может быть от 10 до 15, я понимаю что тут надо применить конструкцию if – else if – else, кто нибудь может объяснить на словах что сейчас нужно сделать, создать функцию? или массив? или переменную? или ещё что?

я попытался через операторы отобразить при каких условиях чему равно Х

просто на словах объясните что сейчас делать, что читать и что искать...


Besprizornik 06.03.2019 05:51

попытаюсь объяснить на пальцах, что самым оптимальным вариантом было бы;

да надо создать переменную 'х' и присвоить ей разные значения при разных условиях, эту переменную так и оставить в строчке.

var x;
var ulDate=new Date(1600,1,9);
if (ulDate>=new Date(1582,9,15)&&ulDate<=new Date(1700,02,11)) x = 10;
else if (ulDate>=new Date(1700,02,12)&&ulDate<=new Date(1800,02,12)) x = 11;


народ, неужели трудно ответить в таком духе? что бы я просто смог сориентироваться что мне надо делать дальше и что спрашивать у гугла...

Besprizornik 09.03.2019 09:38

laimas,
а что если допустим сделать так, показать в селекте для выбора числа всегда 31 опцию, но выделить цветом лишние опции для текущего месяца если такие имеются, ну то есть если в текущем месяце 28, 29, 30 дней?


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