Freemarker/Velocity - date manipulation

南笙酒味 提交于 2019-12-03 09:12:41

In Velocity Tools there is no such method.

I know this is post is really old, but for people from the future still looking for an answer: Date manipulation can be done converting dates to/from milliseconds:

${(mydate?long - 18 * 86400000)?number_to_date?string("yyyy-MM-dd")}

for example would subtract 18 days from mydate. (Note that 86400000 is the amount of milliseconds per day)

For freemarker, perhaps : Built-ins for dates.

You can do it in Velocity too, but not with the DateTool (that belongs the Velocity Extras anyway).

It is a good practice to have a "Format" object with various utilities that are practical for presentational purposes only (you can see the various frameworks that use Velocity how they have "Format" objects).

So your code would look like $format.dateFromNow(), and there would be still a presentational approach.

I found that per @Stefan Haberl, ?long does work on dates to get the same value as java.util.Date.getTime() as a Long. However, I needed a little more explanation to be able to compare dates or modify dates.

Here's the gist:

  1. ?long = java.util.Date.getTime() returns epoch time in milliseconds
  2. At this point, you can add/subtract any number of milliseconds from that number for your manipulation

I like working in seconds instead of milliseconds (less unnecessary zeros, I don't care about milliseconds, etc.), which looks like this:

[#function convertToUnix date]
  [#return (date?date?long / 1000)]
[/#function]

[#-- Output Unix Timestamp --]
${convertToUnix(.now)}

At this point, 86400 = 1 day (because we are in "seconds" now), so you can simply add/subtract that to manipulate the date.

[#assign
  day = 86400
  week = 7 * day
  avgMonth = 365.25 / 12 * day

  testingEndOfDay = convertToUnix(.now) < (convertToUnix(sameDay) + day)
  testingYesterday = convertToUnix(.now) < (convertToUnix(yesterday) + day)
]
${testingEndOfDay?c} # true, .now is less than the end of the day
${testingYesterday?c} # false, .now is greater than the end of yesterday

Note: I am ignoring the time of day, we received dates that started at 12:00AM and wanted to check against .now for the end of the day.

Now, if I want to get a date back from the Unix format (in seconds), I can convert it back using the ?number_to_date builtin

[#assign
  nowAsUnix = convertToUnix(.now)
  prettyDate = (nowAsUnix * 1000)?number_to_date
]

Note: I'm open to edits/improvements as I'm not sure why much of this was required ¯\_(ツ)_/¯

You can write your own methods to use in FreeMarker: http://freemarker.sourceforge.net/docs/pgui_datamodel_method.html

build a DataAddMethod that executes this logic.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!