2017-06-16 91 views
0

我花了将近半天的时间来弄清楚,但无法实现。有人可以帮我解决吗?XSLT 2.0 - 以年,月,日为单位的历史日期和今天之间的日期差异(YYMMDD格式)?

我期待在YYMMDD格式中获得历史日期和今天之间的日期差异,以年,月和日计算。

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

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

+0

只是为了确认输入格式中的'-07:00'部分是什么时区偏移? –

+0

这就是hh:mm,是的,这是从UTC时间开始的时区偏移 – user3836593

+0

您可以构建一个'xs :date'直接来自你的输入格式,例如'xs:date('2017-06-01-07:00')',你也可以减去'current-date()div xs:date('2017-06-01 -07:00')'来获得一个持续时间,但是这是一种不同的格式。 –

回答

1

首先,你应该知道,表达日期差异在几年,几个月和几天是非常没有意义的。

年数和月数没有固定的天数,因此两次计算的测量持续时间相等的计算时间可能很容易以年,月和日的形式返回不同的结果。

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

所有这一切说,如果你想显示在年,月,日的经过时间 - 作为一个例证,例如 - 你可以用下面的方法:

<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

0

您可以使用表达式$d2 - $d1将两个日期$ d1和$ d2之间的差异作为xs:dayTimeDuration获取。结果是在几天之内(你可以通过除以xs:yearMonthDuration('PT1D')将其转换为整数天数。将这个转换为几年,几个月和几天直接可能不会给出令人满意的结果:你想要什么回答2016-02-29 and 2017-02-28?如果您知道一种算法可行,那么在XSLT中表达它不应该太困难,但如果您需要编码方面的帮助,则必须解释算法。

相关问题