首先,你应该知道,表达日期差异在几年,几个月和几天是非常没有意义的。
年数和月数没有固定的天数,因此两次计算的测量持续时间相等的计算时间可能很容易以年,月和日的形式返回不同的结果。
出于同样的原因,没有建立的算法来计算年,月和日的日期差异。
所有这一切说,如果你想显示在年,月,日的经过时间 - 作为一个例证,例如 - 你可以用下面的方法:
<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
只是为了确认输入格式中的'-07:00'部分是什么时区偏移? –
这就是hh:mm,是的,这是从UTC时间开始的时区偏移 – user3836593
您可以构建一个'xs :date'直接来自你的输入格式,例如'xs:date('2017-06-01-07:00')',你也可以减去'current-date()div xs:date('2017-06-01 -07:00')'来获得一个持续时间,但是这是一种不同的格式。 –