Главная » XSLT » Вычисление дня недели

0

Задача

Зная день, месяц и год, требуется определить день недели.

Решение XSLT 1.0

Следующий код возвращает целое число в диапазоне от 0 до 6, где 0 соответ­ствует воскресенью.

<xsl:template name="ckbk:calculate-day-of-the-week"> <xsl:param name="date-time"/>

<xsl:param name="date" select="substring-before($date-time,’T’)"/> <xsl:param name="year" select="substring-before($date,’-‘)"/> <xsl:param name="month"

select="substring-before(substring-after($date,’-‘),,-,)"/> <xsl:param name="day"

select="substring-after(substring-after($date,’-‘),,-,)"/>

<xsl:variable name="a" select="floor((14 – $month) div 12)"/> <xsl:variable name="y" select="$year – $a"/> <xsl:variable name="m" select="$month + 12 * $a – 2"/> <xsl:value-of select="($day + $y + floor($y div 4) – floor($y div 100) + floor($y div 400) + floor((31 * $m) div 12)) mod 7"/>

Функция format-date позволяет получить день недели в виде числа или за­висящей от языка строки.

Обсуждение

И в этом, и в других рецептах применяется функция floor() из языка XPath. Это единственный способ эмулировать целочисленные вычисления в XSLT 1.0, где все числа представлены в формате с плавающей точкой. То, что подобные вычисления работают правильно, объясняется особенностями гри­горианского календаря, никак не связанными с XSLT. Например, из любых 400 последовательных годов 97 являются високосными, поэтому високосным яв­ляется каждый год, который делится на 4, кроме тех, что делятся на 100, но не делятся на 400. Отсюда и последнее выражение в приведенном выше шаблоне. Дополнительную информацию см. во врезке «Логика, лежащая в основе мате­матики».

ЛОГИКА, ЛЕЖАЩАЯ В ОСНОВЕ МАТЕМАТИКИ

Клаус Тендеринг любезно приподнял завесу тайны, скрывающейся за эти­ми вычислениями. Сначала вычисляются следующие значения:

a = (14 – month) / 12

y = year – a

m = month + 12*a – 2

Смысл их в том, чтобы перенести начало года с 1 января на 1 марта. По­скольку a равно 1 для января и февраля и 0 для всех остальных месяцев, то для этих двух месяцев из года вычитается 1. Таким образом, m принимает значение 1для марта, 2 для апреля,… 10 для декабря, 11для января и 12 для февраля.

Теперь год начинается 1 марта, и это дает нам два преимущества. Во-пер­вых, дополнительный день приходится на конец года, что упрощает дальней­шие вычисления. А во-вторых, это означает, что число дней в месяце опреде­ляется простой схемой:

31 30 31 30 31 (март-июль)

31 30 31 30 31 (август-декабрь)

31 X (январь-февраль)

Это дает нам возможность вычислить смещение дня от начала недели по формуле (31*m)/12.

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии