## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

No credit card required

# Working with the ISO Calendar

## Problem

You need to work with dates in the International standard ISO-8601 calendar.[5]

### Warning

Readers familiar with XML Schema should not confuse the ISO calendar with the ISO format for standard Gregorian dates (e.g., 2002-04-12 or 2002-04-12T09:26:00). Both the calendar and the formatting standard are covered in the 8601 standard. This recipe is concerned with the ISO calendar.

## Solution

A basic facility you need to work with ISO dates (and, later, for determining certain holidays) is a function for finding the absolute day of the kth day on or before a specific absolute day. For example, the first Monday (k = 1) on or before January 4, 2004 (absolute day 731,584) is December 29, 2003 (absolute day 731,578):

```<xsl:template name="date:k-day-on-or-before-abs-day">
<xsl:param name="abs-day"/>
<xsl:param name="k"/>
<xsl:value-of select="\$abs-day - ((\$abs-day - \$k) mod 7)"/>
</xsl:template>```

You can now convert ISO dates to absolute days, which is a simple matter of determining the number of absolute days in prior years and adding in the remaining days in the given ISO date:

`<xsl:template name="date:iso-date-to-absolute-day"> <xsl:param name="iso-week"/> <xsl:param name="iso-day"/> <xsl:param name="iso-year"/> <xsl:variable name="jan-4-of-year"> <xsl:call-template name="date:date-to-absolute-day"> <xsl:with-param name="year" select="\$iso-year"/> <xsl:with-param name="month" select="1"/> <xsl:with-param name="day" select="4"/> </xsl:call-template> </xsl:variable> ...`

## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

No credit card required