XSL中实现输入一个日期返回此日期的星期

来源:互联网 发布:内存优化 编辑:程序博客网 时间:2024/05/29 19:56

输入一个日期返回此日期的星期,这个功能需用xsl中实现。

现有一个XSL模板实现了此功能,代码如下:

  1. <msxsl:script language="JScript" implements-prefix="user">
  2.     function getdate(dateNode) {
  3.         var thisDate=dateNode.nextNode().text;
  4.         var index1=thisDate.indexOf("-");
  5.         var index2=thisDate.indexOf("-",index1+1);
  6.         
  7.         var tempYear=thisDate.substring(0,index1);
  8.         var tempMon=thisDate.substring(index1+1,index2);
  9.         var tempDay=thisDate.substring(index2+1);
  10.     
  11.         var dateObj=new Date(tempYear,tempMon-1,tempDay);
  12.         var tempweekday=dateObj.getDay();
  13.         var xxx="";
  14.         switch(tempweekday){
  15.         case 0: xxx="sunday";break;
  16.         case 1: xxx="monday";break;
  17.         case 2: xxx="tuesday";break;
  18.         case 3: xxx="wednesday";break;
  19.         case 4: xxx="thursday";break;
  20.         case 5: xxx="friday";break;
  21.         case 6: xxx="saturday";break;
  22.         }
  23.     return xxx;
  24.     }
  25.     </msxsl:script>

调用:

  1. <xsl:value-of select="user:getdate('2009-10-10')"/>

但是此方法是用微软的JSCRIPT实现的,在IE下可以正常使用,而在FIREFOX下就不行了。因为JSCRIPT是MS自家的,就像HTC一样,都不被FIREFOX支持。

 

如果可以不在XSL模板中就可用JAVASCRIPT来实现:

  1. function getWeek_Zh(dateStr){   
  2.     var index1=dateStr.indexOf("-");
  3.     var index2=dateStr.indexOf("-",index1+1);
  4.     
  5.     var tempYear=dateStr.substring(0,index1);
  6.     var tempMon=dateStr.substring(index1+1,index2);
  7.     var tempDay=dateStr.substring(index2+1);
  8.     var dateObj=new Date(tempYear,tempMon-1,tempDay);
  9.     alert("----------"+dateObj);
  10.     var tempweekday=dateObj.getDay();
  11.     var xxx="";
  12.     switch(tempweekday){
  13.         case 0: xxx="sunday";break;
  14.         case 1: xxx="monday";break;
  15.         case 2: xxx="tuesday";break;
  16.         case 3: xxx="wednesday";break;
  17.         case 4: xxx="thursday";break;
  18.         case 5: xxx="friday";break;
  19.         case 6: xxx="saturday";break;
  20.     }   
  21.     return xxx;
  22.     
  23. }

由于XSL的日期函数比较缺乏,想在xsl模板中用类似new Date(),然后用getDay()的方法来实现是不可能的。一直未找到好的解决方案,昨天在CSDN论坛发帖求教,终于有大大回复,并给出了完美的解决方法:

  1. <xsl:template name="getWeekDay">
  2.   <xsl:param  name="date" ></xsl:param>
  3.   <xsl:variable  name="y" select="substring-before($date,'-')" />
  4.   <xsl:variable  name="m" select="substring-before(substring-after($date,'-'),'-')" />
  5.   <xsl:variable  name="d" select="substring-after(substring-after($date,'-'),'-')" />
  6.     <xsl:variable  name="weekday" select="'一二三四五六日'" />    
  7.   <xsl:choose>
  8.    <xsl:when  test="$m = 1 or $m = 2 ">
  9.     <xsl:call-template name="getWeekDay">
  10.     <xsl:with-param  name="date" select="concat($y - 1,'-',$m+12,'-',$d)"></xsl:with-param>
  11.     </xsl:call-template>    
  12.    </xsl:when>
  13.    <xsl:otherwise>        
  14.     <xsl:variable name="weekNum" select="($d+(2*$m)+floor(3*($m+1) div 5) + $y + floor($y div 4) - floor($y div 100) + floor($y div 400)) mod 7"/>                    
  15.         星期<xsl:value-of select="substring($weekday,$weekNum+1,1)"/>
  16.     </xsl:otherwise>
  17.    </xsl:choose>
  18.  </xsl:template>

调用:

  1. <xsl:call-template name="getWeekDay">
  2.   <xsl:with-param name="date" select="$depDateOfSubSeg"/>
  3. </xsl:call-template>

在此万分感谢yiy19861

 

以上XSLT的解决方案用到了一个算法:基姆拉尔森计算公式

算法如下: 
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7

在公式中d表示日期中的日数,m表示月份数,y表示年数。

 

注意:在公式中有个与其他公式不同的地方:

把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。