Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.12.2021, 17:20
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

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

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <style>
            body {
                margin: 0;
                padding: 0;
            }
            #holiday {
                display: none;
                background: hsl(0, 0%, 90%);
                border: 1px solid hsl(0, 0%, 50%);
                border-radius: 12px/9px;
            }
            .public_holiday {
                color: hsl(340, 100%, 50%);
            }
            .holiday {
                color: hsl(210, 100%, 50%);
            }
            .birthday {
                color: hsl(120, 100%, 25%);
            }
            #holiday,
            .public_holiday,
            .holiday,
            .birthday {
                display: block;
                font: bold 24px/20px serif;
                text-align: center;
                padding: 15px 20px;
            }
        </style>
    </head>
    <body>
        <div id="header">
            <div id="logo"></div>
            <div id="block_time-data"></div>
        </div>
        <div id="holiday"></div>
        <script>
            var holidays = [
                {
                    1: {
                        start: 0,
                        duration: 24,
                        compliments: "С новым годом !",
                    },
                    7: {
                        start: 0,
                        duration: 24,
                        compliments: "С рождеством !",
                    },
                },
                {
                    23: {
                        start: 0,
                        duration: 24,
                        compliments: "С 23 февраля !",
                    },
                },
                {
                    8: { start: 0, duration: 24, compliments: "С 8 марта !" },
                },
                {
                    12: {
                        start: 0,
                        duration: 24,
                        compliments: "С днём космонавтики !",
                    },
                },
                {
                    1: { start: 0, duration: 24, compliments: "С 1 мая !" },
                    2: [
            // Если праздников несколько, то в массив
            // Строка class="***" должна задаваться в ", а не в '
                        {
                            start: 6,
                            duration: 24 * 7 - 6,
                            compliments:
                                '<span class="birthday">С ДНЮХОЙ !</span>',
                        },
                        {
                            start: 0,
                            duration: 24,
                            compliments:
                                '<span class="holiday">С 2 мая !</span>',
                        },
                    ],
                    9: { start: 0, duration: 24, compliments: "С 9 мая !" },
                },
                {
                    1: {
                        start: 0,
                        duration: 24,
                        compliments: "С 1 июня, Всемирным днём родителей !",
                    },
                },
                {
                    3: {
                        start: 0,
                        duration: 24,
                        compliments:
                            "3 июля, день независимости Республики Беларусь !",
                    },
                },
                {
                    12: {
                        start: 0,
                        duration: 24,
                        compliments: "12 августа международный день молодёжи !",
                    },
                },
                {
                    1: {
                        start: 0,
                        duration: 24,
                        compliments: "1 сентября, день знаний !",
                    },
                },
                {
                    1: {
                        start: 0,
                        duration: 24,
                        compliments:
                            "1 октября, международный день пожилых людей !",
                    },
                },
                {
                    7: {
                        start: 0,
                        duration: 24,
                        compliments: "7 ноября, день октябрьской революции !",
                    },
                },
                {
                    25: {
                        start: 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);
            }
 
            const today = new Date("2 May 2021 07:00:00:001"); // d = new Date( "9 May 2021 00:00:00:001" )
 
            function getActualCompliments(now) {
                const result = [];
                holidays.forEach((vm, month) => {
                    for (const day in vm) {
                        let hlds = vm[day];
                        if (!Array.isArray(hlds)) hlds = [hlds];
                        for (const hld of hlds) {
                            const currentDate = new Date(
                                now.getFullYear(),
                                month,
                                +day,
                                +hld.start
                            );
                            const rg = now.getTime() - currentDate.getTime();
                            if (0 <= rg && rg < hld.duration * 3600000) {
                                result.push(hld.compliments);
                            }
                        }
                    }
                });
 
                const caholic = catholicDate(now.getFullYear());
                const 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('<span class="public_holiday">С православной пасхой!</span>');
 
                const radunitsa = new Date(ortodox);
                radunitsa.setDate(radunitsa.getDate() + 9);
                if (
                    radunitsa.getMonth() == now.getMonth() &&
                    radunitsa.getDate() == now.getDate()
                )
                    result.push("С радуницей !");
 
                const trinity = new Date(ortodox);
                trinity.setDate(trinity.getDate() + 49);
                if (
                    trinity.getMonth() == now.getMonth() &&
                    trinity.getDate() == now.getDate()
                )
                    result.push("С троицей!");
 
                return result;
            }
 
            const actualCompliments = getActualCompliments(today);
 
            console.log(actualCompliments);
 
            if (actualCompliments.length > 0) {
                const hollyday = document.getElementById("holiday");
                hollyday.style.display = "block";
                for (const cl of ["public_holiday", "holiday", "birthday"]) {
                    for (const c of actualCompliments) {
                        if (c.indexOf('class="' + cl + '"')>=0) {
                            const div = document.createElement("div");
                            hollyday.appendChild(div);
                            div.innerHTML = c;
                        }
                    }
                }
            }
        </script>
        <div id="footer"></div>
    </body>
</html>
Ответить с цитированием
  #2 (permalink)  
Старый 20.12.2021, 17:20
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

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

что нибудь, типа добавить функцию

return { month: holiday.month, day: days[index] };


Затем объекты таких "плавающих" событий свести в отдельный массив, и тогда в функции getActualCompliments можно вызвать функцию getDate для каждого из них...
массив будет выглядеть примерно так:

const holidays_2 = [
  {
      month: 5, 
      day: 7, 
      number: 1, 
      compliments: "<span class='birthday'>именины Иван</span>",
  },
{
      month: 5, 
      day: 7, 
      number: -5, 
      compliments: "<span class='birthday'>именины Виктор</span>",
  }
]


а потом проверять типа
for (let holiday of holidays_2) {
  const d = getDate(holiday);
  if (d.month == now.getMonth() && d.day == now.getDate()) {
    result.push(holiday.compliments);
  }
}


подобное возможно на JS ?
Ответить с цитированием
  #3 (permalink)  
Старый 20.12.2021, 21:12
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от Блондинка
возможно ли в него добавить плавающие события, где известен месяц, день недели и порядковый номер недели с начала или конца месяца?
...
подобное возможно на JS ?
Да, возможно.
Ответить с цитированием
  #4 (permalink)  
Старый 20.12.2021, 21:12
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,744

Все возможно. Но текст стал слишком большим, и форум не принимает его. Поэтому убрал некоторые праздники
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <style>
            body {
                margin: 0;
                padding: 0;
            }
            #holiday {
                display: none;
                background: hsl(0, 0%, 90%);
                border: 1px solid hsl(0, 0%, 50%);
                border-radius: 12px/9px;
            }
            .public_holiday {
                color: hsl(340, 100%, 50%);
            }
            .holiday {
                color: hsl(210, 100%, 50%);
            }
            .birthday {
                color: hsl(120, 100%, 25%);
            }
            #holiday,
            .public_holiday,
            .holiday,
            .birthday {
                display: block;
                font: bold 24px/20px serif;
                text-align: center;
                padding: 15px 20px;
            }
        </style>
    </head>
    <body>
        <div id="header">
            <div id="logo"></div>
            <div id="block_time-data"></div>
        </div>
        <div id="holiday"></div>
        <script>
            var holidays = [
                {
                },
                {
                    23: {
                        start: 0,
                        duration: 24,
                        compliments: "С 23 февраля !",
                    },
                },
                {
                    8: { start: 0, duration: 24, compliments: "С 8 марта !" },
                },
                {
                    12: {
                        start: 0,
                        duration: 24,
                        compliments: "С днём космонавтики !",
                    },
                },
                {
                    1: { start: 0, duration: 24, compliments: "С 1 мая !" },
                    2: [
            // Если праздников несколько, то в массив
            // Строка class="***" должна задаваться в ", а не в '
                        {
                            start: 6,
                            duration: 24 * 7 - 6,
                            compliments:
                                '<span class="birthday">С ДНЮХОЙ !</span>',
                        },
                        {
                            start: 0,
                            duration: 24,
                            compliments:
                                '<span class="holiday">С 2 мая !</span>',
                        },
                    ],
                    9: { start: 0, duration: 24, compliments: "С 9 мая !" },
                },
                {
                    1: {
                        start: 0,
                        duration: 24,
                        compliments: "С 1 июня, Всемирным днём родителей !",
                    },
                },
                {
                    3: {
                        start: 0,
                        duration: 24,
                        compliments:
                            "3 июля, день независимости Республики Беларусь !",
                    },
                },
                {
                },
                {
                },
                {
                },
                {
                },
                {
                },
            ];
            
// =================== Добавил                       
 // Добавить праздники           
    addHolyday(3, 0, 2,    // второе воскресенье апреля
		{        
			start: 0,
			duration: 24,
			compliments: '<span class="holiday">С днем ПВО</span>',
		}
	)
		
// =================== Добавил             
// Вычисляет число соответствующее дню недели в месяце
// month - месяц (0-11)
// wday - день недели 0 - воскр, 1 - понед ....
// index 1 первый день, 2 - второй ... -1 - последний, -2 предпоследний
            function dayNWeek (month, wday, index)  {
				const wday1 = new Date(new Date().getFullYear(), month).getDay()
				const dd = wday - wday1
				let dayw = 1 + (dd >= 0? dd : 7 + dd);
				const dtwday = new Date(new Date().getFullYear(), month, dayw)
				const adayw =[]
				while (new Date(new Date().getFullYear(), month, dayw).getMonth() == month) {
					adayw.push(dayw)
					dayw += 7
				}
				return adayw[(index>0)? index-1 : adayw.length + index]
			}
// добавляет праздник в массив holidays
			function addHolyday (month, wday, index, hobj) {
				const dt = dayNWeek (month, wday, index);
				holidays[month][dt] = hobj;
			}
// ========================================			
            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);
            }
  
//            const today = new Date("2 May 2021 07:00:00:001"); // d = new Date( "9 May 2021 00:00:00:001" )
const today = new Date (2021, 3, 11)  // ======== Изменил для теста ======
  
            function getActualCompliments(now) {
                const result = [];
                holidays.forEach((vm, month) => {
                    for (const day in vm) {
                        let hlds = vm[day];
                        if (!Array.isArray(hlds)) hlds = [hlds];
                        for (const hld of hlds) {
                            const currentDate = new Date(
                                now.getFullYear(),
                                month,
                                +day,
                                +hld.start
                            );
                            const rg = now.getTime() - currentDate.getTime();
                            if (0 <= rg && rg < hld.duration * 3600000) {
                                result.push(hld.compliments);
                            }
                        }
                    }
                });
  
                const caholic = catholicDate(now.getFullYear());
                const 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('<span class="public_holiday">С православной пасхой!</span>');
  
                const radunitsa = new Date(ortodox);
                radunitsa.setDate(radunitsa.getDate() + 9);
                if (
                    radunitsa.getMonth() == now.getMonth() &&
                    radunitsa.getDate() == now.getDate()
                )
                    result.push("С радуницей !");
  
                const trinity = new Date(ortodox);
                trinity.setDate(trinity.getDate() + 49);
                if (
                    trinity.getMonth() == now.getMonth() &&
                    trinity.getDate() == now.getDate()
                )
                    result.push("С троицей!");
  
                return result;
            }
  
            const actualCompliments = getActualCompliments(today);
  
            console.log(actualCompliments);
  
            if (actualCompliments.length > 0) {
                const hollyday = document.getElementById("holiday");
                hollyday.style.display = "block";
                for (const cl of ["public_holiday", "holiday", "birthday"]) {
                    for (const c of actualCompliments) {
                        if (c.indexOf('class="' + cl + '"')>=0) {
                            const div = document.createElement("div");
                            hollyday.appendChild(div);
                            div.innerHTML = c;
                        }
                    }
                }
            }
        </script>
        <div id="footer"></div>
    </body>
</html>

Последний раз редактировалось voraa, 20.12.2021 в 21:15.
Ответить с цитированием
  #5 (permalink)  
Старый 21.12.2021, 13:40
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

voraa,
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <style>
            body {
                margin: 0;
                padding: 0;
            }
            #holiday {
                display: none;
                background: hsl(0, 0%, 90%);
                border: 1px solid hsl(0, 0%, 50%);
                border-radius: 12px/9px;
            }
            .public_holiday {
                color: hsl(340, 100%, 50%);
            }
            .holiday {
                color: hsl(210, 100%, 50%);
            }
            .birthday {
                color: hsl(120, 100%, 25%);
            }
            #holiday,
            .public_holiday,
            .holiday,
            .birthday {
                display: block;
                font: bold 24px/20px serif;
                text-align: center;
                padding: 15px 20px;
            }
        </style>
    </head>
    <body>
        <div id="header">
            <div id="logo"></div>
            <div id="block_time-data"></div>
        </div>
        <div id="holiday"></div>
        <script>
            var holidays = [
                {
                },
                {
                    23: {
                        start: 0,
                        duration: 24,
                        compliments: "С 23 февраля !",
                    },
                },
                {
                    8: { start: 0, duration: 24, compliments: "С 8 марта !" },
                },
                {
                    12: {
                        start: 0,
                        duration: 24,
                        compliments: "С днём космонавтики !",
                    },
                },
                {
                    1: { start: 0, duration: 24, compliments: "С 1 мая !" },
                    2: [
            // Если праздников несколько, то в массив
            // Строка class="***" должна задаваться в ", а не в '
                        {
                            start: 6,
                            duration: 24 * 7 - 6,
                            compliments:
                                '<span class="birthday">С ДНЮХОЙ !</span>',
                        },
                        {
                            start: 0,
                            duration: 24,
                            compliments:
                                '<span class="holiday">С 2 мая !</span>',
                        },
                    ],
                    9: { start: 0, duration: 24, compliments: "С 9 мая !" },
                },
                {
                    1: {
                        start: 0,
                        duration: 24,
                        compliments: "С 1 июня, Всемирным днём родителей !",
                    },
                },
                {
                    3: {
                        start: 0,
                        duration: 24,
                        compliments:
                            "3 июля, день независимости Республики Беларусь !",
                    },
                },
                {
                },
                {
                },
                {
                },
                {
                },
                {
                },
            ];
            
// =================== Добавил
    addHolyday(4, 0, 1,    // первое воскресенье мая
		{        
			start: 0,
			duration: 24,
			compliments: '<span class="holiday">именины Виктор</span>',
		}),
	(4, 0, -5,    // первое воскресенье мая
		{        
		start: 0,
		duration: 24,
		compliments: '<span class="holiday">именины Иван</span>',
		}
	)
		
// =================== Добавил             
// Вычисляет число соответствующее дню недели в месяце
// month - месяц (0-11)
// wday - день недели 0 - воскр, 1 - понед ....
// index 1 первый день, 2 - второй ... -1 - последний, -2 предпоследний
            function dayNWeek (month, wday, index)  {
				const wday1 = new Date(new Date().getFullYear(), month).getDay()
				const dd = wday - wday1
				let dayw = 1 + (dd >= 0? dd : 7 + dd);
				const dtwday = new Date(new Date().getFullYear(), month, dayw)
				const adayw =[]
				while (new Date(new Date().getFullYear(), month, dayw).getMonth() == month) {
					adayw.push(dayw)
					dayw += 7
				}
				return adayw[(index>0)? index-1 : adayw.length + index]
			}
// добавляет праздник в массив holidays
			function addHolyday (month, wday, index, hobj) {
				const dt = dayNWeek (month, wday, index);
				holidays[month][dt] = hobj;
			}
// ========================================			
            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);
            }
  
//            const today = new Date("2 May 2021 07:00:00:001"); // d = new Date( "9 May 2021 00:00:00:001" )
const today = new Date (2021, 4, 2)  // ======== Изменил для теста ======
  
            function getActualCompliments(now) {
                const result = [];
                holidays.forEach((vm, month) => {
                    for (const day in vm) {
                        let hlds = vm[day];
                        if (!Array.isArray(hlds)) hlds = [hlds];
                        for (const hld of hlds) {
                            const currentDate = new Date(
                                now.getFullYear(),
                                month,
                                +day,
                                +hld.start
                            );
                            const rg = now.getTime() - currentDate.getTime();
                            if (0 <= rg && rg < hld.duration * 3600000) {
                                result.push(hld.compliments);
                            }
                        }
                    }
                });
  
                const caholic = catholicDate(now.getFullYear());
                const 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('<span class="public_holiday">С православной пасхой!</span>');
  
                const radunitsa = new Date(ortodox);
                radunitsa.setDate(radunitsa.getDate() + 9);
                if (
                    radunitsa.getMonth() == now.getMonth() &&
                    radunitsa.getDate() == now.getDate()
                )
                    result.push("С радуницей !");
  
                const trinity = new Date(ortodox);
                trinity.setDate(trinity.getDate() + 49);
                if (
                    trinity.getMonth() == now.getMonth() &&
                    trinity.getDate() == now.getDate()
                )
                    result.push("С троицей!");
  
                return result;
            }
  
            const actualCompliments = getActualCompliments(today);
  
            console.log(actualCompliments);
  
            if (actualCompliments.length > 0) {
                const hollyday = document.getElementById("holiday");
                hollyday.style.display = "block";
                for (const cl of ["public_holiday", "holiday", "birthday"]) {
                    for (const c of actualCompliments) {
                        if (c.indexOf('class="' + cl + '"')>=0) {
                            const div = document.createElement("div");
                            hollyday.appendChild(div);
                            div.innerHTML = c;
                        }
                    }
                }
            }
        </script>
        <div id="footer"></div>
    </body>
</html>
Ответить с цитированием
  #6 (permalink)  
Старый 21.12.2021, 13:59
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

voraa,
для теста установила 2 мая 2021г, когда была пасха, и чей-та не очень хорошо работает, ведь главное чтобы все события за этот день показывались, по идее должно быть 5 событий, пасха, с 2 мая, с днюхой, и два добавленных события именины Виктор, именины Иван...

но не все события видны...
Ответить с цитированием
  #7 (permalink)  
Старый 21.12.2021, 15:06
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,744

1. Функцию addHolyday (строки 142-146) записать так

// добавляет праздник в массив holidays
            function addHolyday (month, wday, index, hobj) {
                const dt = dayNWeek (month, wday, index);
                if (holidays[month][dt]) {
					if (!Array.isArray(holidays[month][dt])) 
						holidays[month][dt] = [holidays[month][dt]];
                } else {
					holidays[month][dt] = [];
                }
                holidays[month][dt].push(hobj);
            }


2. Ее вызов (строки 111 - 123) должен быть таким
addHolyday(4, 0, 1,    // первое воскресенье мая
        {       
            start: 0,
            duration: 24,
            compliments: '<span class="holiday">именины Виктор</span>',
        });
    addHolyday(4, 0, -5,    // первое воскресенье мая
        {       
        start: 0,
        duration: 24,
        compliments: '<span class="holiday">именины Иван</span>',
        }
    );

Т.е для добаления каждого праздника ее надо вызывать, а не нескольких сразу

addHolyday(4, 0, -5, // первое воскресенье мая
Не каждый год в мае 5 воскресений, поэтому лучше addHolyday(4, 0, 1
Но в этом году и -5 работает
Ответить с цитированием
  #8 (permalink)  
Старый 21.12.2021, 15:19
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

Сообщение от voraa
addHolyday(4, 0, -5, // первое воскресенье мая
Не каждый год в мае 5 воскресений, поэтому лучше addHolyday(4, 0, 1
Но в этом году и -5 работает

это понятно, ведь это сделала чисто для тестирования, пойду пробовать...
Ответить с цитированием
  #9 (permalink)  
Старый 21.12.2021, 15:30
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

чисто проверить, что отсчёт индекса идёт от конца месяца...
Ответить с цитированием
  #10 (permalink)  
Старый 21.12.2021, 15:37
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <style>
            body {
                margin: 0;
                padding: 0;
            }
            #holiday {
                display: none;
                background: hsl(0, 0%, 90%);
                border: 1px solid hsl(0, 0%, 50%);
                border-radius: 12px/9px;
            }
            .public_holiday {
                color: hsl(340, 100%, 50%);
            }
            .holiday {
                color: hsl(210, 100%, 50%);
            }
            .birthday {
                color: hsl(120, 100%, 25%);
            }
            #holiday,
            .public_holiday,
            .holiday,
            .birthday {
                display: block;
                font: bold 24px/20px serif;
                text-align: center;
                padding: 15px 20px;
            }
        </style>
    </head>
    <body>
        <div id="header">
            <div id="logo"></div>
            <div id="block_time-data"></div>
        </div>
        <div id="holiday"></div>
        <script>
            var holidays = [
                {
                },
                {
                    23: {
                        start: 0,
                        duration: 24,
                        compliments: "С 23 февраля !",
                    },
                },
                {
                    8: { start: 0, duration: 24, compliments: "С 8 марта !" },
                },
                {
                    12: {
                        start: 0,
                        duration: 24,
                        compliments: "С днём космонавтики !",
                    },
                },
                {
                    1: { start: 0, duration: 24, compliments: "С 1 мая !" },
                    2: [
            // Если праздников несколько, то в массив
            // Строка class="***" должна задаваться в ", а не в '
                        {
                            start: 0,
                            duration: 24,
                            compliments:
                                '<span class="birthday">С ДНЮХОЙ !</span>',
                        },
                        {
                            start: 0,
                            duration: 24,
                            compliments:
                                '<span class="holiday">С 2 мая !</span>',
                        },
                    ],
                    9: { start: 0, duration: 24, compliments: "С 9 мая !" },
                },
                {
                    1: {
                        start: 0,
                        duration: 24,
                        compliments: "С 1 июня, Всемирным днём родителей !",
                    },
                },
                {
                    3: {
                        start: 0,
                        duration: 24,
                        compliments:
                            "3 июля, день независимости Республики Беларусь !",
                    },
                },
                {
                },
                {
                },
                {
                },
                {
                },
                {
                },
            ];
            
// =================== Добавил
	addHolyday(4, 0, 1,    // первое воскресенье мая
	{       
	start: 0,
	duration: 24,
	compliments: '<span class="holiday">именины Виктор</span>',
	});
	addHolyday(4, 0, -5,    // первое воскресенье мая
	{       
	start: 0,
	duration: 24,
	compliments: '<span class="holiday">именины Иван</span>',
	}
	);
		
// ===================             
// Вычисляет число соответствующее дню недели в месяце
// month - месяц (0-11)
// wday - день недели 0 - воскр, 1 - понед ....
// index 1 первый день, 2 - второй ... -1 - последний, -2 предпоследний
            function dayNWeek (month, wday, index)  {
				const wday1 = new Date(new Date().getFullYear(), month).getDay()
				const dd = wday - wday1
				let dayw = 1 + (dd >= 0? dd : 7 + dd);
				const dtwday = new Date(new Date().getFullYear(), month, dayw)
				const adayw =[]
				while (new Date(new Date().getFullYear(), month, dayw).getMonth() == month) {
					adayw.push(dayw)
					dayw += 7
				}
				return adayw[(index>0)? index-1 : adayw.length + index]
			}
			// добавляет праздник в массив holidays
			function addHolyday (month, wday, index, hobj) {
			const dt = dayNWeek (month, wday, index);
			if (holidays[month][dt]) {
			if (!Array.isArray(holidays[month][dt])) 
			holidays[month][dt] = [holidays[month][dt]];
			} else {
			holidays[month][dt] = [];
			}
			holidays[month][dt].push(hobj);
			}
// ========================================			
            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);
            }
  
//            const today = new Date("2 May 2021 07:00:00:001"); // d = new Date( "9 May 2021 00:00:00:001" )
const today = new Date (2021, 4, 2)  // ======== для теста 2 мая 2021г. пасха, с 2 мая, с днюхой, именины Виктор, именины Иван ======
  
            function getActualCompliments(now) {
                const result = [];
                holidays.forEach((vm, month) => {
                    for (const day in vm) {
                        let hlds = vm[day];
                        if (!Array.isArray(hlds)) hlds = [hlds];
                        for (const hld of hlds) {
                            const currentDate = new Date(
                                now.getFullYear(),
                                month,
                                +day,
                                +hld.start
                            );
                            const rg = now.getTime() - currentDate.getTime();
                            if (0 <= rg && rg < hld.duration * 3600000) {
                                result.push(hld.compliments);
                            }
                        }
                    }
                });
  
                const caholic = catholicDate(now.getFullYear());
                const 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('<span class="public_holiday">С православной пасхой!</span>');
  
                const radunitsa = new Date(ortodox);
                radunitsa.setDate(radunitsa.getDate() + 9);
                if (
                    radunitsa.getMonth() == now.getMonth() &&
                    radunitsa.getDate() == now.getDate()
                )
                    result.push("С радуницей !");
  
                const trinity = new Date(ortodox);
                trinity.setDate(trinity.getDate() + 49);
                if (
                    trinity.getMonth() == now.getMonth() &&
                    trinity.getDate() == now.getDate()
                )
                    result.push("С троицей!");
  
                return result;
            }
  
            const actualCompliments = getActualCompliments(today);
  
            console.log(actualCompliments);
  
            if (actualCompliments.length > 0) {
                const hollyday = document.getElementById("holiday");
                hollyday.style.display = "block";
                for (const cl of ["public_holiday", "holiday", "birthday"]) {
                    for (const c of actualCompliments) {
                        if (c.indexOf('class="' + cl + '"')>=0) {
                            const div = document.createElement("div");
                            hollyday.appendChild(div);
                            div.innerHTML = c;
                        }
                    }
                }
            }
        </script>
        <div id="footer"></div>
    </body>
</html>


всё работает, благодарю от души...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возможно ли получить факт изменения ссылки во фрейме?? NickManager Библиотеки/Тулкиты/Фреймворки 4 18.09.2013 21:46
Возможно ли JavaScript'ом подсчитывать события в статическом сайте? jam Ваши сайты и скрипты 3 15.03.2013 19:53
Добавить элементы в div и обрабатывать события по ним. Возможно? Smith324 Events/DOM/Window 2 15.02.2013 05:18
Возможно ли? zork0 Общие вопросы Javascript 8 12.12.2012 16:09
Drug&Drop + всплывание события = проблемы =(( _NoName_ Events/DOM/Window 4 05.03.2009 17:47