从日期值计算周数

时间:2008-10-07 14:58:05

标签: xml xslt date

是否有一些简单的方法可以从存储在XML中的日期值计算Weeknumber值?

它需要是纯XSLT解决方案。我不能使用任何代码:(

6 个答案:

答案 0 :(得分:5)

如果您可以使用EXSLT,则可以使用several date functions。所有这些都是在Saxon中实现的,但是如果你使用的是MSXSL,那么Chris Bayes已经将它们实现为扩展函数,你可以将它们放在msxsl:script元素中的变换中。他的实现从每个特定日期功能页面链接。

week-in-year()是您正在寻找的功能吗?

编辑:根据JeniT的评论,同一网站上有一个pure XSLT 1.0 template,其功能与周年()相同(我认为,她写的),可能更符合您的要求。

答案 1 :(得分:1)

如果您总是希望在同一天开始一周,那么周计算会变得相当复杂,因为一年的第一天总是在变化。有一个用于计算它的ISO标准,请参阅this Wikipedia article

答案 2 :(得分:1)

这是一个纯XSLT 1.0解决方案

可以使用Martin Rowlinson的 datetime_lib.xsl 样式表模块,它带有 XSelerator (一个不错的XSLT IDE,最近自由制作)可在sourceforge上获得)。您必须下载并安装此应用程序,然后您将找到大量其他库和高级技术和解决方案的示例。

可以找到 datetime_lib.xsl 文件(针对典型安装):

C:\ Program Files \ Marrowsoft \ Xselerator25 \ Samples \ Libraries \

从这个库中,这里是名为“week-number”的模板:

<xsl:template name="week-number">
    <xsl:param name="year"/>
    <xsl:param name="month"/>
    <xsl:param name="day"/>
    <!-- or -->
    <xsl:param name="date" select="''"/>  <!-- format: yyyymmdd or yyyy-mm-dd -->
    <!-- or -->
    <xsl:param name="julian-day" select="''"/>
    <!-- trim down date -->
    <xsl:variable name="tdate" select="translate($date,'-','')"/>
    <!-- decide which params were passed -->
    <xsl:variable name="yyyy">
        <xsl:choose>
            <xsl:when test="string-length($date) > 0"><xsl:value-of select="substring($tdate,1,4)"/></xsl:when>
            <xsl:when test="string-length($julian-day) > 0">
                <xsl:variable name="jdate">
                    <xsl:call-template name="julian-day-to-date">
                        <xsl:with-param name="julian-day" select="$julian-day"/>
                    </xsl:call-template>
                </xsl:variable>
                <xsl:value-of select="substring($jdate,1,4)"/>
            </xsl:when>
            <xsl:otherwise><xsl:value-of select="$year"/></xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <!-- get the julian day number -->
    <xsl:variable name="jd">
        <xsl:choose>
            <xsl:when test="string-length($julian-day) > 0"><xsl:value-of select="$julian-day"/></xsl:when>
            <xsl:otherwise>
                <xsl:call-template name="date-to-julian-day">
                    <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="date" select="$date"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <!-- get the julian day number for the first working day of next year -->
    <xsl:variable name="fyjd">
        <xsl:call-template name="first-day-of-year">
            <xsl:with-param name="year" select="$yyyy+1"/>
            <xsl:with-param name="as-julian-day" select="true()"/>
        </xsl:call-template>
    </xsl:variable>
    <!-- decide which the 'working' year for this date is -->
    <xsl:variable name="start-jd">
        <xsl:choose>
            <xsl:when test="$jd >= $fyjd"><xsl:value-of select="$fyjd"/></xsl:when>
            <xsl:otherwise>
                <xsl:call-template name="date-to-julian-day">
                    <xsl:with-param name="date">
                        <xsl:call-template name="first-day-of-year">
                            <xsl:with-param name="year" select="$yyyy"/>
                        </xsl:call-template>
                    </xsl:with-param>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <!-- final calc output -->
    <xsl:value-of select="floor(($jd - $start-jd) div 7) + 1"/>
</xsl:template>



以下是使用“周数”模板的简单XSLT转换:


<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt">

 <xsl:import href=
 "C:\Program Files\Marrowsoft\Xselerator25\Samples\Libraries\datetime_lib.xsl"/>

 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:call-template name="week-number">
       <xsl:with-param name="date" select="'2008-11-16'"/>
     </xsl:call-template>
 </xsl:template>
</xsl:stylesheet>

当应用于任何源XML文档(未使用)时,将生成所需结果:

<强> 46

希望这次答案真的更有帮助。

干杯,

Dimitre Novatchev。

答案 3 :(得分:0)

查看Sal Mangano撰写的XSLT Cookbook。有趣的是,它可以在Google Books上找到。

xslt 2.0方式是:

<xsl:function name="chkbk:calculate-week-number" as="xs:integer">
    <xsl:param name="date" as="xs:date" />
    <xsl:sequence select="xs:integer(format-date($date,'[W]'))" />
</xsl:function>

对于1.0方式,请参阅cookbox预览。顺便说一下,我只是使用xslt weeknumber来搜索它。

答案 4 :(得分:-2)

我在Visual Basic中编程,所以我知道如何使用VB.NET。将XML日期读入变量(让我们称之为 SomeDate )。然后,您构建一个新日期,知道是包含未知日期的年份的开头。然后,让 DateDiff 函数完成工作,告诉你周数。

Dim SomeDate As Date = ReadDateFromXML()
Dim YearStart As New Date(Year(SomeDate), 1, 1)
Dim WeekNumber As Integer = DateDiff(DateInterval.WeekOfYear, YearStart, SomeDate)

答案 5 :(得分:-3)

在C#中:

DateTime date = DateTime.Now;
int week = date.DayOfYear / 7;
Console.WriteLine(week);