Xml XSLT 2.0-历史日期和今天之间的日期差,以年、月、日为单位(YYMMDD格式)?

Xml XSLT 2.0-历史日期和今天之间的日期差,以年、月、日为单位(YYMMDD格式)?,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我花了将近半天的时间来解决这个问题,但没能实现。有人能帮我吗 我希望得到一个历史日期和今天之间的日期差,以年、月、日为单位 例如,如果历史日期的格式为2017-06-01-07:00,则预期值为000016,因为这是历史日期和今天之间的日期差 同样,如果历史日期为2016-07-27-07:00,则预期值为001019,这意味着日期差为历史日期后0年10个月19天 首先,你应该意识到,用年、月、日来表示日期差异是毫无意义的 年和月没有固定的天数长度,因此,两个测量持续时间的计算(以经过的天数为单

我花了将近半天的时间来解决这个问题,但没能实现。有人能帮我吗

我希望得到一个历史日期和今天之间的日期差,以年、月、日为单位

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


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

首先,你应该意识到,用年、月、日来表示日期差异是毫无意义的

年和月没有固定的天数长度,因此,两个测量持续时间的计算(以经过的天数为单位)很容易返回以年、月和日为单位的不同结果

出于同样的原因,目前还没有以年、月和日为单位计算日期差异的既定算法

综上所述,如果您希望以年、月和日为单位显示经过的时间段(例如,作为示例),您可以使用以下方法:

<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> 



调用示例:

您可以使用表达式
$d2-$d1
以xs:dayTimeDuration的形式获取两个日期$d1和$d2之间的差异。结果以天为单位(您可以通过除以xs:yearMonthDuration('PT1D')将其转换为整数天。直接将其转换为年、月、日可能不会产生令人满意的结果:对于2016-02-29和2017-02-28之间的差异,您希望得到什么答案?如果您知道一个有效的算法,那么用XSLT表达它应该不会太难,但如果您需要帮助,您必须解释该算法编码。

只是为了确定,您的输入格式中的
-07:00
部分是什么,时区偏移量?即hh:mm,是的,这是UTC时间的时区偏移量。您可以直接从您的输入格式构建
xs:date
,例如
xs:date('2017-06-01-07:00')
,您还可以减去
当前日期()div xs:date('2017-06-01-07:00')
以获取持续时间,但格式不同。