Date 将Freemarker中的日期格式化为“日期”;今天",&引用;“昨天”;,等
在freemarker中是否有一种方法可以比较日期,以测试日期是今天还是昨天。。。或者我必须用Java编写代码来做这些测试 我基本上想这样做:Date 将Freemarker中的日期格式化为“日期”;今天",&引用;“昨天”;,等,date,format,freemarker,Date,Format,Freemarker,在freemarker中是否有一种方法可以比较日期,以测试日期是今天还是昨天。。。或者我必须用Java编写代码来做这些测试 我基本上想这样做: <#------------------------------------------------------------------------------ formatDate ------------------------------------------------------------------------------->
<#------------------------------------------------------------------------------
formatDate
------------------------------------------------------------------------------->
<#macro formatDate date showTime=true>
<#if date??>
<span class="Date">
<#if date?is_today>
Today
<#elseif date?is_yesterday>
Yesterday
<#else>
${date?date}
</#if>
</span>
<#if showTime>
<span class="Time">${date?time}</span>
</#if>
</#if>
</#macro>
今天
昨天
${date?date}
${date?time}
编辑:我认为实现此功能的最佳方法是将“今天”和“昨天”传递到使用此功能的页面的模型中,然后将日期值与模型中的这两个对象进行比较。我已经没有选择了,但是我不想对每个使用这个宏的页面都这样做。还有其他更好的选择吗
<#if date??>
<span class="Date">
<#if date?date?string.short == today?date?string.short>
Today
<#elseif date?date?string.short == yesterday?date?string.short>
Yesterday
<#else>
${date?date}
</#if>
</span>
<#if showTime>
<span class="Time">${date?time}</span>
</#if>
</#if>
今天
昨天
${date?date}
${date?time}
1。使用以下方法创建实用程序类:
2.在控制器中,将类添加到模型中:
3.在.FTL页面上,使用如下方法:
${StringAndDateUtils.Yesterday或今天(日期)}
您可以将字符串转换为int(注意滚动!)并根据
如果添加额外的数字(如毫秒),请小心不要超过最大int值
(来自上述链接)
我所做的是创建一个用于比较日期的TemplateMethodModel(注意:df是一个带有时区的自定义线程安全SimpleDataFormatter):
TemplateMethodModel可以通过传递解析字符串作为参数并在执行时创建日期格式化程序来变得更通用。由于问题已经很老了,我想问题已经消失了,但无论如何,我只是这样做:
<#assign diff = (mydate?long / 86400000)?round - (.now?long / 86400000)?round />
现在是一个构建,86400是一个每个程序员都可能知道的常数,如果你不被丑陋的外表所拖累,这会给你一个整数天的差。今天是0,昨天是-1等等
如果您想让?U今天起作用吗?有一种方法可以通过实现TemplateDirectiveModel来扩展freemarker语言,如下所述:
但我还不知道如何将它添加到可用选项中?。。。表示法:-)${houradd(日期,24)?字符串(“yyyy-MM-dd HH:MM:ss”)}
${houradd(date,-24)?字符串(“yyyy-MM-dd HH:MM:ss”)}
${dayadd(date,1)?string(“yyyy-MM-dd HH:MM:ss”)}记住,Freemarker只是一种模板语言。。。任何比最简单的逻辑更重要的东西都会把它推得太远。@skaffman:是的,我知道。我真的很喜欢。但对我来说,我真的希望它能做这样的事情——即使是内置的——因为这是表示逻辑类型的东西,而不是业务逻辑。把这类东西放在控制器中实际上会使它们膨胀。比把逻辑放在控制器中并通过模型传递变量更干净。我认为你应该使用
?floor
而不是?round
,因为?round
会使白天在中午而不是午夜改变。我在文档它是一个扩展还是什么?
modelMap.addAttribute("StringAndDateUtils", new StringAndDateUtils());
<#assign date = realDateObject?string("MM/dd/yyyy")/>
${StringAndDateUtils.yesterdayOrToday(date)}
[#assign Adate = myDateA?string("yyyyMMdd")?number?int ]
[#assign Atime = myDateA?string("HHmmss")?number?int ]
[#assign Bdate = myDateB?string("yyyyMMdd")?number?int ]
[#assign Btime = myDateB?string("HHmmss")?number?int ]
public BooleanModel exec(List args) throws TemplateModelException {
int argcnt = args.size();
if (argcnt != 3) {
throw new TemplateModelException("Wrong arguments. Use \"exec(Date?string(\"yyyyMMddHHmmss\"), " +
"CompareString, Date?string(\"yyyyMMddHHmmss\"))\"," +
" where CompareString is < = > ");
}
String firstDate = (String) args.get(0);
String compareString = (String) args.get(1);
String secondDate = (String) args.get(2);
if (null == firstDate || null == secondDate || null == compareString ||
compareString.length() != 1) {
throw new TemplateModelException("Wrong arguments. Use \"exec(Date?string(\"yyyyMMddHHmmss\"), " +
"CompareString, Date?string(\"yyyyMMddHHmmss\"))\"," +
" where CompareString is < = > ");
}
Date first = null;
Date second = null;
try {
first = df.parse(firstDate);
second = df.parse(secondDate);
} catch (ParseException e) {
throw new TemplateModelException("Wrong arguments. Use \"exec(Date?string(\"yyyyMMddHHmmss\"), " +
"CompareString, Date?string(\"yyyyMMddHHmmss\"))\"," +
" where CompareString is < = > ");
}
if ("<".equals(compareString)) {
return new BooleanModel(first.before(second), BeansWrapper.getDefaultInstance());
}
else if ("=".equals(compareString)) {
return new BooleanModel(first.equals(second), BeansWrapper.getDefaultInstance());
}
else if (">".equals(compareString)) {
return new BooleanModel(first.after(second), BeansWrapper.getDefaultInstance());
}
return new BooleanModel(Boolean.FALSE, BeansWrapper.getDefaultInstance());
}
[#if compareDate(now?string("yyyyMMddHHmmss"),"<", program.resStartDateTime?string("yyyyMMddHHmmss"))]
model.put("now", new DateModel(new Date(), BeansWrapper.getDefaultInstance()));
<#assign diff = (mydate?long / 86400000)?round - (.now?long / 86400000)?round />