不复杂,但很麻烦,你可以只使用简单的加减乘除和移位操作实现。
需要先实现判闰年的方法isLeapYear(String year),判月份天数的方法getMonthDayCount(String year,String month)等,我以前用XSL实现了一次,基于字符串操作的,可供你参考。
<!-- 计算指定年度某月份的天数 -->
<xsl:template name="countOfMonthDay">
<xsl:param name="year"/>
<xsl:param name="month"/>
<!-- 闰年 -->
<xsl:variable name="leapyear" select=" $year mod 4 + $year mod 100 + $year mod 400"/>
<xsl:choose>
<xsl:when test="($month = 4) or ($month = 6) or ($month = 9) or ($month = 11)">30</xsl:when>
<xsl:when test="($month = 2) and ($leapyear =0)">29</xsl:when>
<xsl:when test="($month = 2) and ($leapyear !=0)">28</xsl:when>
<xsl:otherwise>31</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- 显示相应数字的汉字名称 -->
<xsl:template name="TranslateNumber2Chinese">
<xsl:param name="value"/>
<xsl:choose>
<xsl:when test="$value=0">零</xsl:when>
<xsl:when test="$value=1">一</xsl:when>
<xsl:when test="$value=2">二</xsl:when>
<xsl:when test="$value=3">三</xsl:when>
<xsl:when test="$value=4">四</xsl:when>
<xsl:when test="$value=5">五</xsl:when>
<xsl:when test="$value=6">六</xsl:when>
<xsl:when test="$value=7">七</xsl:when>
<xsl:when test="$value=8">八</xsl:when>
<xsl:when test="$value=9">九</xsl:when>
<xsl:when test="$value=10">十</xsl:when>
<xsl:when test="$value=11">十一</xsl:when>
<xsl:when test="$value=12">十二</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$value"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- 根据日期计算当日为星期几 -->
<xsl:template name="Week">
<xsl:param name="date"/>
<xsl:variable name="year" select="number(substring($date,1,4))"/>
<xsl:variable name="month" select="number(substring($date,6,2))"/>
<xsl:variable name="day" select="number(substring($date,9,2))"/>
<!-- 1、2月调整为13、14月 -->
<xsl:variable name="monthAdjusted">
<xsl:choose>
<xsl:when test="$month < 3">
<xsl:value-of select="$month+12"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$month"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- 计算 -->
<xsl:variable name="week1" select="($day + 2 * $monthAdjusted+ floor(3 * ($monthAdjusted+1) div 5) + $year +floor($year div 4) - floor($year div 100) + floor($year div 400)) mod 7"/>
<!-- 1、2月结果校正 -->
<xsl:variable name="week">
<xsl:choose>
<xsl:when test="$month < 3">
<xsl:value-of select="$week1 - 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$week1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- 输出 -->
<xsl:choose>
<xsl:when test="$week = -1">7</xsl:when>
<xsl:when test="$week=0">1</xsl:when>
<xsl:when test="$week=1">2</xsl:when>
<xsl:when test="$week=2">3</xsl:when>
<xsl:when test="$week=3">4</xsl:when>
<xsl:when test="$week=4">5</xsl:when>
<xsl:when test="$week=5">6</xsl:when>
<xsl:when test="$week=6">7</xsl:when>
</xsl:choose>
</xsl:template>
<!-- 某年生肖 -->
<xsl:template name="YearAnimals">
<xsl:param name="year"/>
<xsl:value-of select="substring('鼠牛虎兔龙蛇马羊猴鸡狗猪',(($year -4) mod 12)+1,1)"/>
</xsl:template>
<!-- 某年生肖序号 -->
<xsl:template name="YearAnimalsOrder">
<xsl:param name="year"/>
<xsl:value-of select="(($year -4) mod 12)+1"/>
</xsl:template>
需要先实现判闰年的方法isLeapYear(String year),判月份天数的方法getMonthDayCount(String year,String month)等,我以前用XSL实现了一次,基于字符串操作的,可供你参考。
<!-- 计算指定年度某月份的天数 -->
<xsl:template name="countOfMonthDay">
<xsl:param name="year"/>
<xsl:param name="month"/>
<!-- 闰年 -->
<xsl:variable name="leapyear" select=" $year mod 4 + $year mod 100 + $year mod 400"/>
<xsl:choose>
<xsl:when test="($month = 4) or ($month = 6) or ($month = 9) or ($month = 11)">30</xsl:when>
<xsl:when test="($month = 2) and ($leapyear =0)">29</xsl:when>
<xsl:when test="($month = 2) and ($leapyear !=0)">28</xsl:when>
<xsl:otherwise>31</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- 显示相应数字的汉字名称 -->
<xsl:template name="TranslateNumber2Chinese">
<xsl:param name="value"/>
<xsl:choose>
<xsl:when test="$value=0">零</xsl:when>
<xsl:when test="$value=1">一</xsl:when>
<xsl:when test="$value=2">二</xsl:when>
<xsl:when test="$value=3">三</xsl:when>
<xsl:when test="$value=4">四</xsl:when>
<xsl:when test="$value=5">五</xsl:when>
<xsl:when test="$value=6">六</xsl:when>
<xsl:when test="$value=7">七</xsl:when>
<xsl:when test="$value=8">八</xsl:when>
<xsl:when test="$value=9">九</xsl:when>
<xsl:when test="$value=10">十</xsl:when>
<xsl:when test="$value=11">十一</xsl:when>
<xsl:when test="$value=12">十二</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$value"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- 根据日期计算当日为星期几 -->
<xsl:template name="Week">
<xsl:param name="date"/>
<xsl:variable name="year" select="number(substring($date,1,4))"/>
<xsl:variable name="month" select="number(substring($date,6,2))"/>
<xsl:variable name="day" select="number(substring($date,9,2))"/>
<!-- 1、2月调整为13、14月 -->
<xsl:variable name="monthAdjusted">
<xsl:choose>
<xsl:when test="$month < 3">
<xsl:value-of select="$month+12"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$month"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- 计算 -->
<xsl:variable name="week1" select="($day + 2 * $monthAdjusted+ floor(3 * ($monthAdjusted+1) div 5) + $year +floor($year div 4) - floor($year div 100) + floor($year div 400)) mod 7"/>
<!-- 1、2月结果校正 -->
<xsl:variable name="week">
<xsl:choose>
<xsl:when test="$month < 3">
<xsl:value-of select="$week1 - 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$week1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- 输出 -->
<xsl:choose>
<xsl:when test="$week = -1">7</xsl:when>
<xsl:when test="$week=0">1</xsl:when>
<xsl:when test="$week=1">2</xsl:when>
<xsl:when test="$week=2">3</xsl:when>
<xsl:when test="$week=3">4</xsl:when>
<xsl:when test="$week=4">5</xsl:when>
<xsl:when test="$week=5">6</xsl:when>
<xsl:when test="$week=6">7</xsl:when>
</xsl:choose>
</xsl:template>
<!-- 某年生肖 -->
<xsl:template name="YearAnimals">
<xsl:param name="year"/>
<xsl:value-of select="substring('鼠牛虎兔龙蛇马羊猴鸡狗猪',(($year -4) mod 12)+1,1)"/>
</xsl:template>
<!-- 某年生肖序号 -->
<xsl:template name="YearAnimalsOrder">
<xsl:param name="year"/>
<xsl:value-of select="(($year -4) mod 12)+1"/>
</xsl:template>
<xsl:template name="GanZhi">
<xsl:param name="year"/>
<xsl:value-of select="substring('甲乙丙丁戊己庚辛壬癸',($year - 3) mod 10,1)"/>
<xsl:value-of select="substring('子丑寅卯辰巳午未申酉戌亥',($year - 3) mod 12,1)"/>
</xsl:template>
<!-- 阴历名称 -->
<xsl:template name="Lunar">
<xsl:param name="date"/>
<xsl:param name="style"/>
<xsl:call-template name="getLunarName">
<xsl:with-param name="lunarDate" select="document('Lunar.xml')/Root/RecordSet[gDate=$date]/lunar"/>
<xsl:with-param name="style" select="$style"/>
</xsl:call-template>
</xsl:template>
<!-- 阴历名称 -->
<xsl:template name="getLunarName">
<xsl:param name="lunarDate"/>
<xsl:param name="style"/>
<xsl:variable name="lunarYear" select="substring($lunarDate,0,4)"/>
<xsl:variable name="lunarMonth" select="substring($lunarDate,5,2)"/>
<xsl:variable name="lunarDay" select="substring($lunarDate,7,2)"/>
<xsl:variable name="monthName">
<xsl:choose>
<xsl:when test="$lunarMonth < 11">
<xsl:value-of select="substring('正二三四五六七八九十',$lunarMonth,1)"/>
</xsl:when>
<xsl:when test="$lunarMonth = 11">十一</xsl:when>
<xsl:otherwise>十二</xsl:otherwise>
</xsl:choose>月</xsl:variable>
<xsl:variable name="dayName">
<xsl:choose>
<xsl:when test="$lunarDay=1">
<xsl:value-of select="$monthName"/>
</xsl:when>
<xsl:when test="$lunarDay < 11">初<xsl:value-of select="substring('一二三四五六七八九十',$lunarDay ,1)"/>
</xsl:when>
<xsl:when test="($lunarDay > 10) and ($lunarDay < 20)">十<xsl:value-of select="substring('一二三四五六七八九十',$lunarDay - 10 ,1)"/>
</xsl:when>
<xsl:when test="$lunarDay = 20">廿</xsl:when>
<xsl:when test="($lunarDay > 20) and ($lunarDay < 30)">廿<xsl:value-of select="substring('一二三四五六七八九十',$lunarDay -20 ,1)"/>
</xsl:when>
<xsl:when test="$lunarDay = 30">三十</xsl:when>
<xsl:when test="$lunarDay > 30">三<xsl:value-of select="substring('一二三四五六七八九十',$lunarDay -30 ,1)"/>
</xsl:when>
<xsl:otherwise>十</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="$style='0'">
<xsl:value-of select="$monthName"/>
</xsl:if>
<xsl:choose>
<xsl:when test="$dayName='初一'">
<xsl:value-of select="$monthName"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$dayName"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- 节气 -->
<xsl:template name="solarterm">
<xsl:param name="year"/>
<xsl:param name="month"/>
<xsl:param name="day">0</xsl:param>
<xsl:variable name="yearData" select="document('SolarTerm.xml')/Root/RecordSet[year=$year]/holiday"/>
<xsl:variable name="holidayList">小寒大寒立春雨水惊蛰春分清明谷雨立夏小满芒种夏至小暑大暑立秋处暑白露秋分寒露霜降立冬小雪大雪冬至</xsl:variable>
<xsl:variable name="holiday" select="substring($yearData,($month -1)*4+1,4)"/>
<xsl:variable name="holidayName" select="substring($holidayList,($month -1)*4+1,4)"/>
<xsl:choose>
<xsl:when test="$day = number(substring($holiday,1,2))">
<xsl:value-of select="substring($holidayName,1,2)"/>
</xsl:when>
<xsl:when test="$day = number(substring($holiday,3,2))">
<xsl:value-of select="substring($holidayName,3,2)"/>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:template>
<xsl:template name="LastMonth">
<xsl:param name="year"/>
<xsl:param name="month"/>
<xsl:choose>
<xsl:when test="$month - 1 = 0">
<xsl:value-of select="$year - 1"/>12
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$year"/>
<xsl:value-of select="format-number($month - 1 ,'00')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- 下月 返回带年份的6位字符串 -->
<xsl:template name="NextMonth">
<xsl:param name="year"/>
<xsl:param name="month"/>
<xsl:choose>
<xsl:when test="$month + 1 > 12">
<xsl:value-of select="$year + 1"/>01
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$year"/>
<xsl:value-of select="format-number($month + 1 ,'00')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- 返回输入日期所在星期的开始日期 -->
<xsl:template name="WeekFirstDayDate">
<xsl:param name="date"/>
<xsl:variable name="week">
<xsl:call-template name="Week">
<xsl:with-param name="date" select="$date"/>
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="$week = 7 ">
<xsl:value-of select="$date"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="DateBefore">
<xsl:with-param name="date" select="$date"/>
<xsl:with-param name="n" select="$week"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- 返回输入日期前n天的日期 -->
<xsl:template name="DateBefore">
<xsl:param name="date"/>
<xsl:param name="n"/>
<xsl:variable name="year" select="number(substring($date,1,4))"/>
<xsl:variable name="month" select="number(substring($date,6,2))"/>
<xsl:variable name="day" select="number(substring($date,9,2))"/>
<xsl:choose>
<xsl:when test="($day - $n) <= 0">
<!-- 上月 -->
<xsl:variable name="lastMonth">
<xsl:call-template name="LastMonth">
<xsl:with-param name="year" select="$year"/>
<xsl:with-param name="month" select="$month"/>
</xsl:call-template>
</xsl:variable>
<!-- 上月总天数 -->
<xsl:variable name="lastMonthDays">
<xsl:call-template name="countOfMonthDay">
<xsl:with-param name="year" select="substring($lastMonth,1,4)"/>
<xsl:with-param name="month" select="substring($lastMonth,5,2)"/>
</xsl:call-template>
</xsl:variable>
<!-- 上月结束日期 -->
<xsl:variable name="lastMonthEndDate">
<xsl:value-of select="substring($lastMonth,1,4)"/>-<xsl:value-of select="substring($lastMonth,5,2)"/>-<xsl:value-of select="$lastMonthDays"/>
</xsl:variable>
<xsl:call-template name="DateBefore">
<xsl:with-param name="date" select="$lastMonthEndDate"/>
<xsl:with-param name="n" select="$n - $day"/>
</xsl:call-template>
</xsl:when>
<!-- 前n天在本月范围内 -->
<xsl:otherwise>
<xsl:value-of select="$year"/>-<xsl:value-of select="format-number($month,'00')"/>-<xsl:value-of select="format-number($day -$n,'00')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- 返回输入日期后n天的日期 -->
<xsl:template name="DateAfter">
<xsl:param name="date"/>
<xsl:param name="n"/>
<xsl:variable name="year" select="number(substring($date,1,4))"/>
<xsl:variable name="month" select="number(substring($date,6,2))"/>
<xsl:variable name="day" select="number(substring($date,9,2))"/>
<!-- 本月总天数 -->
<xsl:variable name="monthDays">
<xsl:call-template name="countOfMonthDay">
<xsl:with-param name="year" select="$year"/>
<xsl:with-param name="month" select="$month"/>
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="($day + $n) > $monthDays">
<!-- 下月 -->
<xsl:variable name="nextMonth">
<xsl:call-template name="NextMonth">
<xsl:with-param name="year" select="$year"/>
<xsl:with-param name="month" select="$month"/>
</xsl:call-template>
</xsl:variable>
<!-- 下月起始日期 -->
<xsl:variable name="nextMonthStartDate">
<xsl:value-of select="substring($nextMonth,1,4)"/>-<xsl:value-of select="substring($nextMonth,5,2)"/>-01
</xsl:variable>
<xsl:call-template name="DateAfter">
<xsl:with-param name="date" select="$nextMonthStartDate"/>
<xsl:with-param name="n" select="$n - ($monthDays - $day) - 1"/>
</xsl:call-template>
</xsl:when>
<!-- 后n天在本月范围内 -->
<xsl:otherwise>
<xsl:value-of select="$year"/>-<xsl:value-of select="format-number($month,'00')"/>-<xsl:value-of select="format-number($day +$n,'00')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>