我遇到一个问题,我的Freemarker模板在不同的机器上生成不同的日期格式。
我的Freemarker宏看起来像这样:
<#macro renderTextEntry textEntry>
<div id="text_entry_${textEntry.id}" class="text_entry">
<span id="text_entry_${textEntry.id}_date" class="text_entry_date">${textEntry.time?datetime}</span>:
<div id="text_entry_${textEntry.id}_content" class="text_entry_content"><#noescape>${textEntry.text}</#noescape></div>
<button class="edit_text_entry">Edit</button>
<a class="delete_text_entry" href="/delete-text-entry?id=${textEntry.id}"><img
src="images/delete.png" alt="delete text entry"/></a>
</div>
</#macro>
我对结果进行了单元测试,预期结果为:
<div id="text_entry_5" class="text_entry">
<span id="text_entry_5_date" class="text_entry_date">Jan 2, 1970 11:17:36 AM</span>:
<div id="text_entry_5_content" class="text_entry_content">some text</div>
<button class="edit_text_entry">Edit</button>
<a class="delete_text_entry" href="/delete-text-entry?id=5">
<img src="images/delete.png" alt="delete text entry"/>
</a>
</div>
此测试通过一台机器。另一方面,它失败了。唯一的区别是日期输出为
02-Jan-1970 11:17:36
TextEntry.getDate()返回一个java.util.Date对象。
两台机器都是运行OSX 10.7.5和Java 1.7.0_10-b18的MacbookPros。我不知道我设置的任何环境变量会影响默认的DateFormat - 只需运行
System.out.println(new Date());
在两台机器上产生相同的输出。我不知道这里发生了什么 - 非常感谢任何帮助!
注意:我已经通过明确声明我想要的日期格式解决了我的问题 - 现在相关的Freemarker片段
${textEntry.time?string("MMM d, yyyy HH:mm:ss a")}
然而,了解这里发生的事情仍然很好!
答案 0 :(得分:2)
也许您在另一台计算机上使用其他浏览器语言?
据我所知,默认日期格式取决于所使用的语言环境。
答案 1 :(得分:2)
由于日期/时间格式因国籍而异,因此FreeMarker的默认日期/时间格式取决于FreeMarker的locale
设置。有关FreeMarker设置,请参阅http://freemarker.org/docs/pgui_config_settings.html。如您所见,locale
设置可以在不同级别指定,并且最好在模板外部完成。如果您的应用程序未国际化,您可能希望使用Configuration
在FreeMarker setLocale(Locale)
对象中进行设置。否则,您可能希望在Environment
级别上执行相同操作,以使其适合当前访问者的区域设置。
由于您未在任何地方指定locale
,因此FreeMarker使用了Java选择的默认语言环境,这通常是OS(Web服务器)的默认语言环境。从Date.toString
开始,它主要用于程序员眼睛的调试,因此它忽略了区域设置,这就是为什么它总是打印相同的。
请注意,如果与语言区域相关联的格式仍然不符合您的要求,则可以使用date_format
,time_format
和datetime_format
设置对日期和时间格式进行微调。 FreeMarker的。使用?string('...')
只是最后的选择。