помогите исправить скрипт поздравлений
есть такой скрипт
<!DOCTYPE html> <html> <head> <meta charset='utf-8'> <meta http-equiv='X-UA-Compatible' content='IE=edge'> <title>Page Title</title> <meta name='viewport' content='width=device-width, initial-scale=1'> </head> <body> <style> #hollyday>div { background-color: #ececec; text-align: center; border: 1px solid #999; padding: 20px; color: #f00; font: bold 24px serif; } </style> <div id="hollyday"> </div> <script> var fixDates = [ { month: 3, day: 8, hour: 8, duration: 12, compliments: "С 8 марта" }, { month: 3, day: 9, hour: 12, duration: 2, compliments: "Поздравление с Днем счастливых!" }, { month: 4, day: 11, hour: 8, duration: 12, compliments: "С днём космонавтики !" }, { month: 4, day: 30, hour: 12, duration: 2, compliments: "с 30 апреля! " }, { month: 5, day: 1, hour: 0, duration: 48, compliments: "С 1 мая !" }, { month: 5, day: 9, hour: 12, duration: 2, compliments: "С 9 мая !" } ]; function catholicDate(year) { var a = year % 19; var b = year % 4; var c = year % 7; var k = Math.floor(year / 100); var p = Math.floor((13 + 8 * k) / 25); var q = Math.floor(k / 4); var m = (15 - p + k - q) % 30; var n = (4 + k - q) % 7; var d = (19 * a + m) % 30; var e = (2 * b + 4 * c + 6 * d + n) % 7; if (d === 29 && e === 6) return new Date(year, 3, 19); if (d === 28 && e === 6 && ((11 * m + 11) % 30 < 19)) return new Date(year, 3, 18); if (d + e > 9) return new Date(year, 3, d + e - 9); else return new Date(year, 2, 22 + d + e); } function orthodoxDate(year) { var a = year % 19; var b = year % 4; var c = year % 7; var d = (19 * a + 15) % 30; var e = (2 * b + 4 * c + 6 * d + 6) % 7; var f = d + e; return f <= 26 ? new Date(year, 3, 4 + f) : new Date(year, 4, f - 26); } function getActualCompliments() { var now = new Date( "11 May 2021 00:00:00:000" ); // кат.пасха "4 April 2021 00:00:00:000", прав.пасха "2 May 2021 00:00:00:000", радуница "11 May 2021 00:00:00:000", троица "20 June 2021 00:00:00:000" var result = fixDates.filter(v => { var currentDate = new Date(now.getFullYear(), v.month - 1, v.day, v.hour); var durms = v.duration * 3600000; console.log(now, currentDate, (now - currentDate) / 3600000); var rg = now - currentDate; return rg <= durms && rg >= 0; }).map(v => v.compliments); var caholic = catholicDate(now.getFullYear()); var ortodox = orthodoxDate(now.getFullYear()); if (caholic.getMonth() == now.getMonth() && caholic.getDate() == now.getDate()) result.push("С католической пасхой!"); if (ortodox.getMonth() == now.getMonth() && ortodox.getDate() == now.getDate()) result.push("С православной пасхой!"); var trinity = new Date(ortodox); trinity.setDate(trinity.getDate() + 49); if (trinity.getMonth() == now.getMonth() && trinity.getDate() == now.getDate()) result.push("С троицей!"); var radunitsa = new Date(ortodox); radunitsa.setDate(trinity.getDate() + 9); if (radunitsa.getMonth() == now.getMonth() && radunitsa.getDate() == now.getDate()) result.push("С радуницей !"); return result; } var actualCompliments = getActualCompliments(); console.log(actualCompliments); if (actualCompliments.length > 0) { var hollyday = document.getElementById("hollyday"); hollyday.style.display = "block"; for (var c of actualCompliments) { var div = document.createElement("div"); hollyday.appendChild(div); div.textContent = c; } } function foo(month, day, compliment, hour = 0) { return { month: month, day: day, hour: hour, compliment: compliment } } var now9 = new Date(); now9.setDate(now9.getDate() + 9); console.log(now9); var now49 = new Date(); now49.setDate(now49.getDate() + 49); console.log(now49); </script> </body> </html> но если устанавливаю дату 11 мая 2021 г. чтобы посмотреть, почему-то не показывает блок с поздравлением, как исправить? и возможно ли сделать чтобы оба поздравления были в одном блоке (2 мая 2021г.) если на один день выпало два события... |
Блондинка,
строка 122, now49.setDate(now9.getDate() + 9); убрать красное, вам же консоль об этой ошибке пишет!нет никакой now49 в строке 122, есть now9, а now49 возникнет позднее |
рони,
убрала, и всё равно ничего не показывает, см в первом посте, исправляю запускаемый пример... |
Блондинка,
вам необходимо менять массив праздников в строке 27. пишите свой код в строке 35 и не лезьте в функцию getActualCompliments |
Блондинка,
примерно так ... <!DOCTYPE html> <html> <head> <meta charset='utf-8'> <meta http-equiv='X-UA-Compatible' content='IE=edge'> <title>Page Title</title> <meta name='viewport' content='width=device-width, initial-scale=1'> </head> <body> <style> #hollyday>div { background-color: #ececec; text-align: center; border: 1px solid #999; padding: 20px; color: #f00; font: bold 24px serif; } </style> <div id="hollyday"> </div> <script> var fixDates = [ { month: 3, day: 8, hour: 8, duration: 12, compliments: "С 8 марта" }, { month: 3, day: 9, hour: 12, duration: 2, compliments: "Поздравление с Днем счастливых!" }, { month: 4, day: 11, hour: 8, duration: 12, compliments: "С днём космонавтики !" }, { month: 4, day: 30, hour: 12, duration: 2, compliments: "с 30 апреля! " }, { month: 5, day: 1, hour: 0, duration: 48, compliments: "С 1 мая !" }, { month: 5, day: 9, hour: 12, duration: 2, compliments: "С 9 мая !" }, ]; var now = new Date( "11 May 2021 00:00:00:000" ); // кат.пасха "4 April 2021 00:00:00:000", прав.пасха "2 May 2021 00:00:00:000", радуница "11 May 2021 00:00:00:000", троица "20 June 2021 00:00:00:000" var caholic = catholicDate(now.getFullYear()); var ortodox = orthodoxDate(now.getFullYear()); var trinity = new Date(ortodox); var radunitsa = new Date(ortodox); radunitsa.setDate(trinity.getDate() + 9); if (radunitsa.getMonth() == now.getMonth() && radunitsa.getDate() == now.getDate()) fixDates.push({ month: 5, day: 11, hour: 0, duration: 24, compliments: "С радуницей !" }); function catholicDate(year) { var a = year % 19; var b = year % 4; var c = year % 7; var k = Math.floor(year / 100); var p = Math.floor((13 + 8 * k) / 25); var q = Math.floor(k / 4); var m = (15 - p + k - q) % 30; var n = (4 + k - q) % 7; var d = (19 * a + m) % 30; var e = (2 * b + 4 * c + 6 * d + n) % 7; if (d === 29 && e === 6) return new Date(year, 3, 19); if (d === 28 && e === 6 && ((11 * m + 11) % 30 < 19)) return new Date(year, 3, 18); if (d + e > 9) return new Date(year, 3, d + e - 9); else return new Date(year, 2, 22 + d + e); } function orthodoxDate(year) { var a = year % 19; var b = year % 4; var c = year % 7; var d = (19 * a + 15) % 30; var e = (2 * b + 4 * c + 6 * d + 6) % 7; var f = d + e; return f <= 26 ? new Date(year, 3, 4 + f) : new Date(year, 4, f - 26); } function getActualCompliments() { var result = fixDates.filter(v => { var currentDate = new Date(now.getFullYear(), v.month - 1, v.day, v.hour ); var durms = v.duration * 3600000; console.log(now, currentDate, (now - currentDate) / 3600000); var rg = now - currentDate; return rg <= durms && rg >= 0; }).map(v => v.compliments); return result; } var actualCompliments = getActualCompliments(); console.log(actualCompliments); if (actualCompliments.length > 0) { var hollyday = document.getElementById("hollyday"); hollyday.style.display = "block"; for (var c of actualCompliments) { var div = document.createElement("div"); hollyday.appendChild(div); div.textContent = c; } } function foo(month, day, compliment, hour = 0) { return { month: month, day: day, hour: hour, compliment: compliment } } </script> </body> </html> |
рони,
:thanks: |
рони,
сорри, но радуница и троица это преходящие праздники, радуница всегда через 9 дней после прав,пасхи, а троица через 49 дней после прав,пасхи, другими словами надо добавить к православной пасхе 9 и 49 дней и в эти даты показать поздравление... |
Цитата:
|
рони,
<!DOCTYPE html> <html> <head> <meta charset='utf-8'> <meta http-equiv='X-UA-Compatible' content='IE=edge'> <title>Page Title</title> <meta name='viewport' content='width=device-width, initial-scale=1'> </head> <body> <style> #hollyday>div { background-color: #ececec; text-align: center; border: 1px solid #999; padding: 20px; color: #f00; font: bold 24px serif; } </style> <div id="hollyday"> </div> <script> var fixDates = [ { month: 3, day: 8, hour: 8, duration: 12, compliments: "С 8 марта" }, { month: 3, day: 9, hour: 12, duration: 2, compliments: "Поздравление с Днем счастливых!" }, { month: 4, day: 11, hour: 8, duration: 12, compliments: "С днём космонавтики !" }, { month: 4, day: 30, hour: 12, duration: 2, compliments: "с 30 апреля! " }, { month: 5, day: 1, hour: 0, duration: 48, compliments: "С 1 мая !" }, { month: 5, day: 9, hour: 12, duration: 2, compliments: "С 9 мая !" } ]; function catholicDate(year) { var a = year % 19; var b = year % 4; var c = year % 7; var k = Math.floor(year / 100); var p = Math.floor((13 + 8 * k) / 25); var q = Math.floor(k / 4); var m = (15 - p + k - q) % 30; var n = (4 + k - q) % 7; var d = (19 * a + m) % 30; var e = (2 * b + 4 * c + 6 * d + n) % 7; if (d === 29 && e === 6) return new Date(year, 3, 19); if (d === 28 && e === 6 && ((11 * m + 11) % 30 < 19)) return new Date(year, 3, 18); if (d + e > 9) return new Date(year, 3, d + e - 9); else return new Date(year, 2, 22 + d + e); } function orthodoxDate(year) { var a = year % 19; var b = year % 4; var c = year % 7; var d = (19 * a + 15) % 30; var e = (2 * b + 4 * c + 6 * d + 6) % 7; var f = d + e; return f <= 26 ? new Date(year, 3, 4 + f) : new Date(year, 4, f - 26); } function getActualCompliments() { var now = new Date( "11 May 2021 00:00:00:001" ); // кат.пасха "4 April 2021 00:00:00:001", прав.пасха "2 May 2021 00:00:00:001", радуница "11 May 2021 00:00:00:001", троица "20 June 2021 00:00:00:001" var result = fixDates.filter(v => { var currentDate = new Date(now.getFullYear(), v.month - 1, v.day, v.hour); var durms = v.duration * 3600000; console.log(now, currentDate, (now - currentDate) / 3600000); var rg = now - currentDate; return rg <= durms && rg >= 0; }).map(v => v.compliments); var caholic = catholicDate(now.getFullYear()); var ortodox = orthodoxDate(now.getFullYear()); if (caholic.getMonth() == now.getMonth() && caholic.getDate() == now.getDate()) result.push("С католической пасхой!"); if (ortodox.getMonth() == now.getMonth() && ortodox.getDate() == now.getDate()) result.push("С православной пасхой!"); var trinity = new Date(ortodox); trinity.setDate(trinity.getDate() + 49); if (trinity.getMonth() == now.getMonth() && trinity.getDate() == now.getDate()) result.push("С троицей!"); var radunitsa = new Date(ortodox); radunitsa.setDate(trinity.getDate() + 9); if (radunitsa.getMonth() == now.getMonth() && radunitsa.getDate() == now.getDate()) result.push("С радуницей !"); return result; } var actualCompliments = getActualCompliments(); console.log(actualCompliments); if (actualCompliments.length > 0) { var hollyday = document.getElementById("hollyday"); hollyday.style.display = "block"; for (var c of actualCompliments) { var div = document.createElement("div"); hollyday.appendChild(div); div.innerHTML = c; } } function foo(month, day, compliment, hour = 0) { return { month: month, day: day, hour: hour, compliment: compliment } } var now9 = new Date(); now9.setDate(now9.getDate() + 9); console.log(now9); var now49 = new Date(); now49.setDate(now49.getDate() + 49); console.log(now49); </script> </body> </html> если в этом скрипте в 75 строке указать другие даты из комментария к этой строке (после //), то три даты показывает а одну нет, как это исправить? |
если в 75 строке изменить
var now = new Date( "2 May 2021 00:00:00:001" ); или var now = new Date( "4 April 2021 00:00:00:001" ); или var now = new Date( "20 June 2021 00:00:00:001" ); всё показывает, а если var now = new Date( "11 May 2021 00:00:00:001" ); то пусто, как это исправить? |
вот рабочий вариант, всё работает и всё показывает...
<!DOCTYPE html> <html> <head> <meta charset='utf-8'> <meta http-equiv='X-UA-Compatible' content='IE=edge'> <title>Page Title</title> <meta name='viewport' content='width=device-width, initial-scale=1'> </head> <body> <style> #hollyday>div { background-color: #ececec; text-align: center; border: 1px solid #999; padding: 20px; color: #f00; font: bold 24px serif; } </style> <div id="hollyday"> </div> <script> var fixDates = [ { month: 3, day: 8, hour: 0, duration: 12, compliments: "С 8 марта !" }, { month: 3, day: 9, hour: 0, duration: 2, compliments: "С 9 марта !!" }, { month: 4, day: 11, hour: 0, duration: 12, compliments: "С днём космонавтики !" }, { month: 4, day: 30, hour: 0, duration: 2, compliments: "с 30 апреля !" }, { month: 5, day: 1, hour: 0, duration: 24, compliments: "С 1 мая !" }, { month: 5, day: 9, hour: 0, duration: 2, compliments: "С 9 мая !" } ]; function catholicDate(year) { var a = year % 19; var b = year % 4; var c = year % 7; var k = Math.floor(year / 100); var p = Math.floor((13 + 8 * k) / 25); var q = Math.floor(k / 4); var m = (15 - p + k - q) % 30; var n = (4 + k - q) % 7; var d = (19 * a + m) % 30; var e = (2 * b + 4 * c + 6 * d + n) % 7; if (d === 29 && e === 6) return new Date(year, 3, 19); if (d === 28 && e === 6 && ((11 * m + 11) % 30 < 19)) return new Date(year, 3, 18); if (d + e > 9) return new Date(year, 3, d + e - 9); else return new Date(year, 2, 22 + d + e); } function orthodoxDate(year) { var a = year % 19; var b = year % 4; var c = year % 7; var d = (19 * a + 15) % 30; var e = (2 * b + 4 * c + 6 * d + 6) % 7; var f = d + e; return f <= 26 ? new Date(year, 3, 4 + f) : new Date(year, 4, f - 26); } function getActualCompliments() { var now = new Date( "9 May 2021 00:00:00:001" ); // кат.пасха "4 April 2021 00:00:00:000", прав.пасха "2 May 2021 00:00:00:000", радуница "11 May 2021 00:00:00:000", троица "20 June 2021 00:00:00:000" var result = fixDates.filter(v => { var currentDate = new Date(now.getFullYear(), v.month - 1, v.day, v.hour); var durms = v.duration * 3600000; console.log(now, currentDate, (now - currentDate) / 3600000); var rg = now - currentDate; return rg <= durms && rg >= 0; }).map(v => v.compliments); var caholic = catholicDate(now.getFullYear()); var ortodox = orthodoxDate(now.getFullYear()); if (caholic.getMonth() == now.getMonth() && caholic.getDate() == now.getDate()) result.push("С католической пасхой!"); if (ortodox.getMonth() == now.getMonth() && ortodox.getDate() == now.getDate()) result.push("С православной пасхой!"); var radunitsa = new Date(ortodox); radunitsa.setDate(radunitsa.getDate() + 9); if (radunitsa.getMonth() == now.getMonth() && radunitsa.getDate() == now.getDate()) result.push("С радуницей !"); var trinity = new Date(ortodox); trinity.setDate(trinity.getDate() + 49); if (trinity.getMonth() == now.getMonth() && trinity.getDate() == now.getDate()) result.push("С троицей!"); return result; } var actualCompliments = getActualCompliments(); console.log(actualCompliments); if (actualCompliments.length > 0) { var hollyday = document.getElementById("hollyday"); hollyday.style.display = "block"; for (var c of actualCompliments) { var div = document.createElement("div"); hollyday.appendChild(div); div.innerHTML = c; } } function foo(month, day, compliment, hour = 0) { return { month: month, day: day, hour: hour, compliment: compliment } } var now9 = new Date(); now9.setDate(now9.getDate() + 9); console.log(now9); var now49 = new Date(); now49.setDate(now49.getDate() + 49); console.log(now49); </script> </body> </html> поскольку в каждом месяце достаточно много событий, возможно ли их отсортировать по месяцам? что-бы работало без всяких (month, day, hour, duration) что-то типа этого var fixDates = { '1': { '1': {'compliments': 'С новым годом !'}, '7': {'compliments': 'С рождеством !'} }, // {'compliments': 'какой-то текс/картинка'} // может не иметь других параметров // или может иметь один или два дополнительных параметра // {'start': (0), 'compliments': 'какой-то текс/картинка'} // {'duration': (0), 'compliments': 'какой-то текс/картинка'} // {'stop': (0), 'compliments': 'какой-то текс/картинка'} // или два // {'start': (0), 'duration': (0), 'compliments': 'какой-то текс/картинка'} // {'start': (0), 'stop': (0), 'compliments': 'какой-то текс/картинка'} // все три дополнительных параметра (start, duration, stop) могут принимать значечения // (00) только часы // (00:00) часы минуты // (00:00:00) часы минуты секунды '2': { '23': {'compliments': 'С 23 февраля !'} }, '3': { '8': {'compliments': 'С 8 марта !'} }, '4': { '12': {'compliments': 'С 12 апреля, днём космонавтики !'} }, '5': { '1': {'compliments': 'С 1 мая !'}, '9': {'С 9 мая !'} }, '6': { '1': {'compliments': 'С 1 июня, Всемирным днём родителей !'} }, '7': { '3': {'compliments': '3 июля, день независимости Республики Беларусь !'} }, '8': { '12': {'12 августа международный день молодёжи !'} }, '9': { '1': {'compliments': '1 сентября, день знаний !'} }, '10': { '1': {'compliments': '1 октября, международный день пожилых людей !'} }, '11': { '7': {'compliments': '7 ноября, день октябрьской революции !'} }, '12': { '25': {'compliments': 'С католическим рождеством !'} } } надеюсь что понятен замысел... |
цель этого скрипта, вывести поздравление с гос.праздниками трёх стран (Россия, Украина, Беларусь), и с днём рождения пользователей сайта, поэтому в принципе указывать час начала события и продолжительность не обязательно, получается много дублирующего кода, но для различных экстренных ситуаций должна быть возможность установить время начала и окончания события если событие длится в течении одних суток (start и stop), или начало и продолжительность (start и duration), если событие длится двое суток и более...
поскольку поздравлений с днём рождения достаточно много, то опять получается очень много дублирующего кода, (месяц, дата, час), поэтому намного будет создать список месяцев, а потом список дат когда есть событие, так значительно уменьшится количество ненужного кода, и проще ориентироваться, добавлен ли пользователь в список, и не даст возможность дважды вывести одно и тоже поздравление... |
народ, как в скрипте из 11 поста исправить список фиксированных дат, заменить на на список месяцев, а потом внутри каждого месяца сделать списки с датами? другими словами надо создать массив из 12 месяцев, и в каждом месяце надо создать массив дат, одним словом массив в массиве...
|
???
|
Часовой пояс GMT +3, время: 04:40. |