我花了将近半天时间来解决这个问题,但却无法实现。有人可以帮帮我吗?
我希望以YYMMDD格式的年数,月数和日数来确定历史日期和今天之间的日期差异。
例如,如果历史日期的格式为2017-06-01-07:00,则预期值为000016,因为它是历史日期与今天之间的日期差异。
同样,如果历史日期是2016-07-27-07:00,则预期值为001019,这意味着日期差异为自历史日期起的0年,10个月,19天。
答案 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>
答案 1 :(得分:0)
您可以使用表达式$d2 - $d1
将两个日期$ d1和$ d2之间的差异作为xs:dayTimeDuration。结果是以天为单位(您可以将其转换为整数天除以xs:yearMonthDuration('PT1D')
。直接将其转换为年,月和日可能不会给出满意的结果:您想要什么答案对于2016-02-29和2017-02-28之间的区别?如果你知道一个有效的算法,那么在XSLT中表达它应该不会太困难,但如果你需要帮助,你必须解释算法与编码。