java - 如何获得准确的速度日期差

标签 java velocity

我正在使用 Velocity,希望获得两个日期之间整年的准确日期差异。如果您使用this tool你会看到这两个日期之间已经有整整 64 年了。我能得到的返回速度只有 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天已经过去了。关于如何让 Velocity 在此计算中返回 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端,在你自己的工具中进行。

(已编辑以修复天数,可以正确定义该天数) (编辑以修复月份变量名称)

关于java - 如何获得准确的速度日期差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57627901/

相关文章:

java - 对象克隆错误

java - 我如何将我的应用程序在 Play 商店中的当前价格获取到每个位置以便在 textView 中显示

java - 如何在速度模板中使用 'for' 循环?

java - 从嵌套 JAR 加载 Velocity 模板

java - 如何将字符串转换为整数以用于 Velocity 中的循环?

java - 如何在不重新加载服务器的情况下重新加载模板?

java - 套接字文件传输

java - <T>(尖括号)在 Java 中意味着什么?

java - 如何使用JLabel和Swing Timer来短暂通知用户?

java - 如何禁用速度日志