|
|
|
|
|
для: studentPO
(24.05.2008 в 12:55)
| |
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=win-1251">
<script>
onload = function () {document.getElementById ('d1').focus ()} //*1
function ComeOn () //*2
{
for (var timeValue = new Array (), j = 1; j < 3; j++) //*3
{
var x = document.getElementById ('d' + j).value; //*4
if (x.replace (/\d\d-\d\d-\d{4}/i, '').length || !x.length) //*5
{
alert ('Формат ' + ((j == 1) ? 'перв' : 'втор') + 'ой даты неверен!');
document.getElementById ('d' + j).select ();
return; //*6
}
else //*7
{
var DoM = '313232332323'.split (''); //*8
var dmy = x.split ('-');
for (var k = 0; k < dmy.length; k++) dmy [k] = parseInt (dmy [k]); dmy [1]--; //*9
var rezTest = true; //*10
if (!dmy [2]) rezTest = false; //*11
if (dmy [0] < 1 || dmy [0] > (28 + DoM [dmy [1]])) rezTest = false; //*12
if (dmy [1] < 0 || dmy [1] > 11) rezTest = false; //*13
var leapYear = (((dmy [2] % 100 != 0) && (dmy [2] % 4 == 0)) || (dmy [2] % 400 == 0)); //*14
if (dmy [1] == 1 && !leapYear && dmy [0] == 29) rezTest = false; //*15
if (!rezTest)
{
alert ('В ' + ((j == 1) ? 'перв' : 'втор') + 'ое поле введена несуществующая дата!');
document.getElementById ('d' + j).select ();
return; //*16
}
}
timeValue [j] = dmy; //*17
}
var d = new Date (); //*18
for (var TimeMS = new Array (), j = 1; j < 3; j++)
{
d.setDate (timeValue [j] [0]);
d.setMonth (timeValue [j] [1]);
d.setYear (timeValue [j] [2]);
TimeMS [j] = d.valueOf (); //*19
}
var x = Math.floor (Math.abs (TimeMS [1] - TimeMS [2]) / 1000 / 60 / 60 / 24);
alert ('Между двумя введенными датами прошло суток - ' + x); //*20
}
</script>
</head>
<body>
<span style="width: 25em">Введите первую дату в формате ДД-ММ-ГГГГ: </span
><input id="d1" style="width: 15em">
<br><br>
<span style="width: 25em">Введите вторую дату в формате ДД-ММ-ГГГГ: </span
><input id="d2" style="width: 15em">
<br><br>
<input style="width: 15em; margin-left: 25em"
type="button" value="Вычислить" onclick="ComeOn ()">
</body>
</html>
| *1 после загрузки страницы помещаем курсор в поле ввода первой даты
*2 функция проверки правильности ввода и вычисления результата ComeOn ()
*3 проверка правильности ввода дат в оба поля (j = 1 и j = 2)
*4 запоминаем значение, введенное в j-ое поле
*5 проверяем значение j-го поля на формат (по маске) и на "непустоту"
*6 если значение j-го поля "пустое" или введено не в нужном формате, то со-
общаем об этом в алерте и выходим из функции, "пометив" неверное поле
*7 если значение j-го поле соответствует формату, проверяем введен-
ную дату на существование (количество дней в месяце с учетом високосности)
*8 массив количества дней в месяцах по формуле 28+х (для февраля используем 28+1)
*9 из значения j-го поля получаем массив из 3-х элементов (день, месяц, год), пере-
водим их в численный вид и отнимаем от месяца единицу
*10 результат проверки даты на существование изначально выставляем как СУЩЕСТВУЕТ
*11 если введен 0-ой год, то НЕ СУЩЕСТВУЕТ
*12 если день равен нулю или больше максимального числа дней в месяце, то НЕ СУЩЕСТВУЕТ
*13 если номер месяца меньше нуля или большее 11-ти, то НЕ СУЩЕСТВУЕТ
*14 определяем, високосный ли год введен ("кратен 4, при этом не кратен 100, либо кратен 400")
*15 если введено "29 февраля" при невисокосном годе, то НЕ СУЩЕСТВУЕТ
*16 если проверка j-го поля на существование введенной даты даст НЕ СУЩЕСТВУЕТ, то со-
общаем об этом в алерте и выходим из функции, "пометив" неверное поле
*17 при ВЕРНО запоминаем день, (месяц - 1), год j-го поля
*18 создаем объект Date ()
*19 устанавливаем время, соответствующее введенному в j-ое поле и запоминаем его в миллисекундах
*20 вычисляем модуль разности дат в сутках, округляя до меньшего целого и выводим результат
---------------------------
Что до требуемого вывода в виде "сколько лет, месяцев и дней между этими датами", то таковая
постановка задачи мне не очень понятна.
Ибо:
1. Вполне можно сказать, что между 01.03.2007 и 01.03.2008 прошел "ровно один год".
2. Также можно сказать, что между 28.02.2007 и 28.02.2008 тоже прошел "ровно один год"
3. А сколько тогда прошло между 28.02.2007 и 29.02.2008?
Тоже "ровно один год"? Или всё же "один год и один день"?
А между 28.02.2005 и 29.02.2008? "Три года и один день"? Или же "три года ровно"?
А между 25.02.2005 и 01.03.2008? "Три года и четыре дня"? Или же "три года и пять дней"?
Когда ответите (сами или ваш преподаватель) В ОБЩЕМ ВИДЕ на вопросы пункта 3, тогда смогу помочь с расчетом. | |
|
|
|
|
|
|
|
для: PAT
(23.05.2008 в 22:57)
| | уж извините уважаемый РАТ, но мне эта вещь с датами вообще не понятна.
даты в формате дд-мм-гггг. а сделать необходимо именно на JS потому что сообщение о том сколько лет должно появляться алертом сразу, таковы уж требования моего преподавателя. | |
|
|
|
|
|
|
|
для: StudentPO
(23.05.2008 в 19:22)
| | То, что "двоечник" - это понятно.
Но вот то, что неумеющий читать является студентом - это выше моего понимания.
Цитирую сам себя: "способ вычленения не прописываю, ибо не знаю - в каком именно виде у вас будут вводиться данные в поля - кто-то пишет 23.02.08, кто-то 23.2.2008, можно писать 23-02-2008 или 23/II 2008 и так далее"
Студент-двоечник, НИЧЕГО не написав о том, в КАКОМ ИМЕННО ВИДЕ в полях будут прописаны даты, все-равно спрашивает: "как получить из поля эти три значения?"
Берите лопату, идите в поле и выкапывайте... все три значения... | |
|
|
|
|
|
|
|
для: PAT
(23.05.2008 в 18:23)
| | спасибо, это уже кое что.
Подскажите, пожалуйста, студенту-двоечнику как получить из поля эти три значения?
mD = 23;
mM = 1; //январь - 0-й месяц, февраль - 1-й месяц, март - 2-й,.. декабрь - 11-й месяц.
mY = 2008; | |
|
|
|
|
|
|
|
для: studentpo
(23.05.2008 в 17:28)
| | 1. Из введенных в поля даты надо КАКИМ-ТО ОБРАЗОМ вычленить год, месяц и день в числовом формате (способ вычленения не прописываю, ибо не знаю - в каком именно виде у вас будут вводиться данные в поля - кто-то пишет 23.02.08, кто-то 23.2.2008, можно писать 23-02-2008 или 23/II 2008 и так далее).
Например, если в первое поле введено в каком-то виде 23 февраля 2008 года, то надо получить три численных значения:
mD = 23;
mM = 1; //январь - 0-й месяц, февраль - 1-й месяц, март - 2-й,.. декабрь - 11-й месяц.
mY = 2008;
| и затем установить эти параметры для объекта Date ():
var d = new Date ();
d.setDate (mD);
d.setMonth (mM);
d.setYear (mY);
|
после чего надо запомнить численное значение установленной первой даты:
var time1 = d.valueOf ();
|
2. Проделать аналогичное для значения второго поля и запомнить time2
3. Затем надо вычислить разность time1 - time2 и взять модуль полученного числа. Это и будет промежуток времени в миллисекундах.
Делим результат на 1000 - получим в секундах.
Далее делим на 60 - получим в минутах.
Еще раз на 60 - получим в часах.
Потом на 24 - получим в сутках.
А если ещё на 7 - в неделях... | |
|
|
|
|
|
|
| есть 2 поля куда вводятся даты. необходимо расчитать сколько лет, месяцев и дней между этими датами. Подскажите скрипт пожалуйста | |
|
|
|
|