Иногда возникает непонятное желание получить дату в Юлианском стиле.
Если у кого-то вдруг это желание возникает при написании XSLT преобразования, то ему - я думаю - облегчит жизнь следующий скрипт (julian-1600.xsl):
Если у кого-то вдруг это желание возникает при написании XSLT преобразования, то ему - я думаю - облегчит жизнь следующий скрипт (julian-1600.xsl):
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template name="julian"> <!--Construct Julian value for the Date--> <xsl:param name="date"/> <xsl:param name="add" select="0"/> <xsl:param name="year"/> <xsl:param name="month"/> <xsl:param name="day"/> <xsl:param name="jul_year"/> <xsl:param name="jul_month"/> <xsl:param name="jul_day"/> <xsl:choose> <xsl:when test="number($add) != $add"> <xsl:call-template name="julian"> <xsl:with-param name="date" select="$date"/> <xsl:with-param name="add" select="0"/> <xsl:with-param name="year" select="$year"/> <xsl:with-param name="month" select="$month"/> <xsl:with-param name="day" select="$day"/> <xsl:with-param name="jul_year" select="$jul_year"/> <xsl:with-param name="jul_month" select="$jul_month"/> <xsl:with-param name="jul_day" select="$jul_day"/> </xsl:call-template> </xsl:when> <xsl:when test="string-length($date) >= 10"> <xsl:call-template name="julian"> <xsl:with-param name="year" select="substring-before($date,'-')"/> <xsl:with-param name="month" select="substring-before(substring-after($date,'-'),'-')"/> <xsl:with-param name="day"> <xsl:choose> <xsl:when test="contains($date,'T')"> <xsl:value-of select="substring-before(substring-after(substring-after($date,'-'),'-'),'T')"/> </xsl:when> <xsl:otherwise>substring-after(substring-after($date,'-'),'-'))</xsl:otherwise> </xsl:choose> </xsl:with-param> <xsl:with-param name="jul_year" select="1600"/> <xsl:with-param name="jul_month" select="1"/> <xsl:with-param name="jul_day" select="1"/> <xsl:with-param name="add" select="2305448 + $add"/> </xsl:call-template> </xsl:when> <xsl:when test="number($jul_year) + 400 <= number($year)"> <xsl:call-template name="julian"> <xsl:with-param name="year" select="$year"/> <xsl:with-param name="month" select="$month"/> <xsl:with-param name="day" select="$day"/> <xsl:with-param name="jul_year" select="$jul_year+400"/> <xsl:with-param name="jul_month" select="$jul_month"/> <xsl:with-param name="jul_day" select="$jul_day"/> <xsl:with-param name="add" select="$add + 365*400 + 97"/> </xsl:call-template> </xsl:when> <xsl:when test="number($jul_year) + 4 <= number($year)"> <xsl:call-template name="julian"> <xsl:with-param name="year" select="$year"/> <xsl:with-param name="month" select="$month"/> <xsl:with-param name="day" select="$day"/> <xsl:with-param name="jul_year" select="$jul_year+4"/> <xsl:with-param name="jul_month" select="$jul_month"/> <xsl:with-param name="jul_day" select="$jul_day"/> <xsl:with-param name="add" select="$add + 365*4 + 1"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:variable name="bis_sextus"> <xsl:value-of select="1 * (number($jul_year) mod 400 = 0 or (number($jul_year) mod 4 = 0 and number($jul_year) mod 100 != 0))"/> </xsl:variable> <xsl:variable name="month_days"> <xsl:value-of select="31 - (number($jul_month)=4 or number($jul_month)=6 or number($jul_month)=9 or number($jul_month)=11) * 1 - (number($jul_month)=2)*(3-number($bis_sextus))"/> </xsl:variable> <xsl:choose> <xsl:when test="number($jul_year) < number($year)"> <xsl:call-template name="julian"> <xsl:with-param name="year" select="$year"/> <xsl:with-param name="month" select="$month"/> <xsl:with-param name="day" select="$day"/> <xsl:with-param name="jul_year" select="$jul_year+1"/> <xsl:with-param name="jul_month" select="$jul_month"/> <xsl:with-param name="jul_day" select="$jul_day"/> <xsl:with-param name="add" select="$add + 365 + $bis_sextus"/> </xsl:call-template> </xsl:when> <xsl:when test="number($jul_month) < number($month)"> <xsl:call-template name="julian"> <xsl:with-param name="year" select="$year"/> <xsl:with-param name="month" select="$month"/> <xsl:with-param name="day" select="$day"/> <xsl:with-param name="jul_year" select="$jul_year"/> <xsl:with-param name="jul_month" select="$jul_month + 1"/> <xsl:with-param name="jul_day" select="$jul_day"/> <xsl:with-param name="add" select="$add + $month_days"/> </xsl:call-template> </xsl:when> <xsl:when test="number($jul_day) < number($day)"> <xsl:call-template name="julian"> <xsl:with-param name="year" select="$year"/> <xsl:with-param name="month" select="$month"/> <xsl:with-param name="day" select="$day"/> <xsl:with-param name="jul_year" select="$jul_year"/> <xsl:with-param name="jul_month" select="$jul_month"/> <xsl:with-param name="jul_day" select="$day"/> <xsl:with-param name="add" select="$add + $day - $jul_day"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$add"/> </xsl:otherwise> </xsl:choose> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
Ну и ниже привожу пример трансляции xml файла с датой в её "Юлианское" представление.
root.xml:<?xml version="1.0" encoding="UTF-8"?> <root>2011-12-02T00:00:00</root>
root.xsl:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:include href="julian-1600.xsl"/> <xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="root">Julian (<xsl:value-of select="."/>): <xsl:call-template name="julian"> <xsl:with-param name="date"> <xsl:value-of select="."/> </xsl:with-param> </xsl:call-template> </xsl:template> </xsl:stylesheet>
msxsl root.xml root.xsl:
Julian (2011-12-02T00:00:00): 2455898
P.S.> Единственное ограничение - дата не ранее 01.01.1600.