2

我有一个问题,我的 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 的 MacbookPro。我不知道我设置的任何影响默认 DateFormat 的环境变量 - 只是运行

System.out.println(new Date());

在两台机器上产生相同的输出。我不知道这里发生了什么 - 任何帮助将不胜感激!

注意:我通过明确声明我想要的日期格式解决了我的问题 - 相关的 Freemarker 片段现在是

${textEntry.time?string("MMM d, yyyy HH:mm:ss a")}

但是,很高兴了解这里发生了什么!

4

2 回答 2

2

也许您在另一台计算机上使用另一种浏览器语言?

据我所知,默认日期格式取决于使用的语言环境。

于 2012-12-23T18:59:45.420 回答
2

由于日期/时间格式因您的国籍而异,因此 FreeMarker 的默认日期/时间格式取决于 FreeMarker 的locale设置。有关 FreeMarker 设置,请参阅http://freemarker.org/docs/pgui_config_settings.html 。如您所见,locale可以在各个级别指定设置,并且最好在模板之外完成。如果您的应用程序没有国际化,您可能希望在 FreeMarkerConfiguration对象中使用setLocale(Locale). 否则,您可能希望在Environment-level 上执行相同的操作,以使其适合当前访问者的语言环境。

由于您没有指定locale任何地方,FreeMarker 使用了 Java 选择的默认语言环境,这通常是操作系统(Web 服务器)的默认语言环境。截至Date.toString,它主要用于调试,程序员的眼睛,所以它忽略了语言环境,这就是为什么它总是打印相同的。

请注意,如果与区域设置关联的格式仍然不是您想要的,可以使用FreeMarker的date_formattime_format和设置微调日期和时间格式。datetime_format使用?string('...')只是最后的手段。

于 2012-12-23T23:16:17.077 回答