如何在 Velocity 中获得准确的日期差异
How to get accurate date difference in Velocity
我正在使用 Velocity 并希望获得两个日期之间整年的准确日期差异。如果你使用 this tool 你会看到这两个日期之间有 64 整年。我能达到 return 的速度是 65 年
我试过以下代码:
($date 是 dateTool,$compareDate 是 ComparisonDateTool,$number 是 NumberTool)
#set( $defaultTimeZone = $date.getTimeZone().getTimeZone("GMT") )
#set( $defaultLocale = $date.getLocale() )
#set( $ISO8601 = "yyyy-MM-dd'T'HH:mm:ss" )
#set ($resDateObj = $date.toDate($ISO8601,"1954-06-26T00:00:00",$defaultLocale,$defaultTimeZone))
#set ($incepDateObj = $date.toDate($ISO8601,"2019-06-20T00:00:00",$defaultLocale,$defaultTimeZone))
#set($diffRemaining = $compareDate.difference($resDateObj, $incepDateObj).getYears())
#set($weeksRemaining = $number.toNumber($diffRemaining).intValue())
years is: $weeksRemaining
这段代码的输出是: 年是:65
我想这是因为平年的总数(365 天)是 6502.74。
现实64年11个月25天过去了。关于如何将此计算的速度设为 return 64 的任何想法。
ComparisonDateTool 的实现非常糟糕,因为它只计算日期之间的毫秒数,然后通过除以常量来近似年、月和日。
您可以使用 Calendar 对象按年、月和日细分计算:
#set( $defaultTimeZone = $date.getTimeZone().getTimeZone("GMT") )
#set( $defaultLocale = $date.getLocale() )
#set( $ISO8601 = "yyyy-MM-dd'T'HH:mm:ss" )
#set ($resDateObj = $date.toDate($ISO8601,"1954-06-26T00:00:00"))
#set ($incepDateObj = $date.toDate($ISO8601,"2019-06-20T00:00:00"))
#set ($resCalObj = $date.toCalendar($resDateObj))
#set ($incepCalObj = $date.toCalendar($incepDateObj))
## years
#set($years = $incepCalObj.get(1) - $resCalObj.get(1))
## months
#set($months = $incepCalObj.get(2) - $resCalObj.get(2))
#if($months < 0)
#set($years = $years - 1)
#set($months = $months + 12)
#end
## days
#set($days = $incepCalObj.get(5) - $resCalObj.get(5))
#if($days < 0)
#set($months = $months - 1)
#if($months < 0)
#set($years = $years - 1)
#set($months = $months + 12)
#end
## go to previous month
$incepCalObj.add(2, -1)
#set($days = $days + $incepCalObj.getActualMaximum(5))
#end
years: $years
months: $months
days: $days
给出结果:
years: 64
months: 11
days: 25
您应该注意到这段代码并不真正属于模板。此计算应在 java 端使用您自己的工具进行。
(编辑固定天数,可以正确定义)
(编辑以修复月份变量名称)
我正在使用 Velocity 并希望获得两个日期之间整年的准确日期差异。如果你使用 this tool 你会看到这两个日期之间有 64 整年。我能达到 return 的速度是 65 年
我试过以下代码:
($date 是 dateTool,$compareDate 是 ComparisonDateTool,$number 是 NumberTool)
#set( $defaultTimeZone = $date.getTimeZone().getTimeZone("GMT") )
#set( $defaultLocale = $date.getLocale() )
#set( $ISO8601 = "yyyy-MM-dd'T'HH:mm:ss" )
#set ($resDateObj = $date.toDate($ISO8601,"1954-06-26T00:00:00",$defaultLocale,$defaultTimeZone))
#set ($incepDateObj = $date.toDate($ISO8601,"2019-06-20T00:00:00",$defaultLocale,$defaultTimeZone))
#set($diffRemaining = $compareDate.difference($resDateObj, $incepDateObj).getYears())
#set($weeksRemaining = $number.toNumber($diffRemaining).intValue())
years is: $weeksRemaining
这段代码的输出是: 年是:65
我想这是因为平年的总数(365 天)是 6502.74。
现实64年11个月25天过去了。关于如何将此计算的速度设为 return 64 的任何想法。
ComparisonDateTool 的实现非常糟糕,因为它只计算日期之间的毫秒数,然后通过除以常量来近似年、月和日。
您可以使用 Calendar 对象按年、月和日细分计算:
#set( $defaultTimeZone = $date.getTimeZone().getTimeZone("GMT") )
#set( $defaultLocale = $date.getLocale() )
#set( $ISO8601 = "yyyy-MM-dd'T'HH:mm:ss" )
#set ($resDateObj = $date.toDate($ISO8601,"1954-06-26T00:00:00"))
#set ($incepDateObj = $date.toDate($ISO8601,"2019-06-20T00:00:00"))
#set ($resCalObj = $date.toCalendar($resDateObj))
#set ($incepCalObj = $date.toCalendar($incepDateObj))
## years
#set($years = $incepCalObj.get(1) - $resCalObj.get(1))
## months
#set($months = $incepCalObj.get(2) - $resCalObj.get(2))
#if($months < 0)
#set($years = $years - 1)
#set($months = $months + 12)
#end
## days
#set($days = $incepCalObj.get(5) - $resCalObj.get(5))
#if($days < 0)
#set($months = $months - 1)
#if($months < 0)
#set($years = $years - 1)
#set($months = $months + 12)
#end
## go to previous month
$incepCalObj.add(2, -1)
#set($days = $days + $incepCalObj.getActualMaximum(5))
#end
years: $years
months: $months
days: $days
给出结果:
years: 64
months: 11
days: 25
您应该注意到这段代码并不真正属于模板。此计算应在 java 端使用您自己的工具进行。
(编辑固定天数,可以正确定义) (编辑以修复月份变量名称)