簡體   English   中英

Freemarker / Velocity-日期操作

[英]Freemarker/Velocity - date manipulation

關於這兩個模板引擎,我有一個非常簡單的問題。
我正在嘗試設定一個將來/過去的日期,從現在開始的固定時間,例如18個月前或明天。

我知道可以用速度/ freemarker模板(類似於$date.add(2,-18) )中的java date對象來執行此操作,但我想使用DateTool或freemarker核心來執行此操作

我認為這純粹是演示性的(只是考慮在預訂表中看到的默認日期),因此我看不到任何原因導致模板引擎無法執行此操作。

有可能嗎? 如果是這樣,怎么辦?

我知道這是真的很老的帖子,但是對於將來的人們來說,仍然在尋找答案:可以通過將日期轉換為毫秒來進行日期操作:

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

例如將從mydate減去18天。 (請注意,86400000是每天的毫秒數)

對於freemarker,也許是: 內置日期

在Velocity Tools中,沒有這種方法。

您也可以在Velocity中完成此操作,但不能使用DateTool(總之屬於Velocity Extras)完成此操作。

好的做法是讓“格式”對象帶有各種實用工具,這些實用工具僅用於演示目的(您可以看到使用Velocity的各種框架如何使用“格式”對象)。

因此,您的代碼將類似於$ format.dateFromNow(),並且仍然會有一種表示方法。

我發現每個@Stefan Haberl 可以在日期上使用?long來獲取與 Long 相同的值與java.util.Date.getTime() 但是,我需要更多說明才能比較日期或修改日期。

這是要點:

  1. ?long = java.util.Date.getTime()返回紀元時間(以毫秒為單位)
  2. 此時,您可以從該數字中減去/減去任何毫秒數進行操作

我喜歡用秒而不是毫秒來工作(減少不必要的零,我不在乎毫秒等),如下所示:

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

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

此時, 86400 = 1天(因為我們現在處於“秒”狀態),因此您只需添加/減去該日期即可。

[#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

注意 :我忽略了一天中的時間,我們收到的日期開始於12:00 AM,並希望在當天結束時檢查.now

現在,如果我想從Unix格式中獲取日期(以秒為單位),則可以使用內置?number_to_date來將其轉換回

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

注意 :我可以進行編輯/改進,因為我不確定為什么需要這么多¯\\ _(ツ)_ /¯

您可以編寫自己的方法在FreeMarker中使用: http : //freemarker.sourceforge.net/docs/pgui_datamodel_method.html

構建執行此邏輯的DataAddMethod。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM