XSLT 2.0 - 历史日期与今天之间的年数,月份,天数(YYMMDD格式)的日期差异?

时间:2017-06-16 07:21:42

标签: xml xslt xslt-2.0

我花了将近半天时间来解决这个问题,但却无法实现。有人可以帮帮我吗?

我希望以YYMMDD格式的年数,月数和日数来确定历史日期和今天之间的日期差异。

例如,如果历史日期的格式为2017-06-01-07:00,则预期值为000016,因为它是历史日期与今天之间的日期差异。

同样,如果历史日期是2016-07-27-07:00,则预期值为001019,这意味着日期差异为自历史日期起的0年,10个月,19天。

2 个答案:

答案 0 :(得分:2)

首先,您应该知道,表达年,月和日的日期差异几乎毫无意义。

年数和月数的天数不长,因此,根据经过的天数计算持续时间的两次计算可能很容易在年,月和日方面返回不同的结果。

出于同样的原因,没有建立的算法来计算年,月和日的日期差异。

所有这一切,如果您希望显示年,月和日的经过时间 - 例如 - 您可以使用以下方法:

<xsl:template name="date-diff-in-ymd">
    <xsl:param name="start-date"/>
    <xsl:param name="end-date"/>

    <xsl:variable name="start-year" select="year-from-date($start-date)"/>
    <xsl:variable name="start-month" select="month-from-date($start-date)"/>
    <xsl:variable name="start-day" select="day-from-date($start-date)"/>

    <xsl:variable name="end-year" select="year-from-date($end-date)"/>
    <xsl:variable name="end-month" select="month-from-date($end-date)"/>
    <xsl:variable name="end-day" select="day-from-date($end-date)"/>

    <xsl:variable name="elapsed-months" select="12*($end-year - $start-year) + $end-month - $start-month - number($end-day lt $start-day)"/>
    <xsl:variable name="birthday" select="$start-date + xs:yearMonthDuration(concat('P0Y', $elapsed-months, 'M'))"/>

    <xsl:variable name="years" select="$elapsed-months idiv 12"/>
    <xsl:variable name="months" select="$elapsed-months mod 12"/>
    <xsl:variable name="days" select="days-from-duration($end-date - $birthday)"/>

    <xsl:value-of select="concat($years, ' years, ', $months, ' months and ', $days, ' days')" />
</xsl:template> 

通话示例:http://xsltransform.net/a9GiwM

答案 1 :(得分:0)

您可以使用表达式$d2 - $d1将两个日期$ d1和$ d2之间的差异作为xs:dayTimeDuration。结果是以天为单位(您可以将其转换为整数天除以xs:yearMonthDuration('PT1D')。直接将其转换为年,月和日可能不会给出满意的结果:您想要什么答案对于2016-02-29和2017-02-28之间的区别?如果你知道一个有效的算法,那么在XSLT中表达它应该不会太困难,但如果你需要帮助,你必须解释算法与编码。