在FreeMarker中解析日期时出错

时间:2018-08-17 08:47:58

标签: liferay freemarker

在formart越南时间,我遇到了错误。美国的语言设置运行良好,但是更改为VN会出现错误。

Error: on line 20, column 11 in 10157#10197#22325
    The string doesn't match the expected date/time format. The string to parse was: "CN, 15 thg 7 2018 18:54:00 +0700". The expected format was: "EEE, dd MMM yyyy hh:mm:ss zzz".

我使用liferay 6.2,使用Freemarker模板显示Web内容。这是我的代码。

<#assign articleDisplayDate = .vars['reserved-article-display-date'].data />
<#assign AssetEntryLocalService = serviceLocator.findService("com.liferay.portlet.asset.service.AssetEntryLocalService" )>
<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.portlet.journal.service.JournalArticleLocalService")>

<#assign currentArticle = JournalArticleLocalService.getArticle(getterUtil.getLong(groupId),.vars['reserved-article-id'].data)>
<#assign currentArticleResourcePrimKey = currentArticle.getResourcePrimKey()>

<#assign currentArticleAssetEntry = AssetEntryLocalService.getEntry("com.liferay.portlet.journal.model.JournalArticle", currentArticleResourcePrimKey)/>



<div class="wrapcap">
  <h3 class="title">
     <a href="">${.vars['reserved-article-title'].data}</a>
  </h3>
</div>
<div class="datecomm">
  <span>
  <i class="fa fa-calendar" aria-hidden="true"></i> 
  <span>${articleDisplayDate?date("EEE, dd MMM yyyy hh:mm:ss zzz")?string("MMMM, dd yyyy")}</span>
  </span>
  <span><i class="fa fa-eye" aria-hidden="true"></i> Số lượt xem: <span>${currentArticleAssetEntry.viewCount}</span></span>
</div>
<div class="desccomm">
  <p></p>
</div>
<div class="contentcomm">
  ${content.getData()}
</div>

不知道这种日期格式。

4 个答案:

答案 0 :(得分:1)

它正在正确报告错误。

让我们一起验证:

  

该字符串与预期的日期/时间格式不匹配。字符串   解析为:“ CN,2018年7月15日18:54:00 +0700”。预期格式   是:“ EEE,dd MMM yyyy hh:mm:ss zzz”。

“ CN,2018年7月15日18:54:00 +0700”

所以EEE是CN,检查。

dd是15,请检查。

thg是MMM。对此一无所知,请检查。

yyyy是7。在我看来不合适。

hh是2018。绝对不对。

等,等等,等等。

答案 1 :(得分:0)

这是测试结果。

英语:

  • $ {articleDisplayDate}:2018年7月15日,星期日18:54:00 +0700

  • $ {。now?string(“ EEE,dd MMM yyyy hh:mm:ss zzz”)}:2018年8月20日,星期一10:46:48 GMT + 07:00

越南语:

  • $ {articleDisplayDate}:CN,2018年7月15日18:54:00 +0700
  • $ {。now?string(“ EEE,dd MMM yyyy hh:mm:ss zzz”)}:2018年8月20日,星期一10:47:46 GMT + 07:00

答案 2 :(得分:0)

从您提供的样本来看,问题似乎在于您的locale FreeMarker配置设置是某种英语(请尝试${.locale}来查看)。解析日期/时间/日期时间,甚至是数字时,当前的区域设置很重要,因为日期和月份等的名称取决于区域设置。

因此,您应该将locale设置为越南语。通常,locale FreeMarker配置设置是在模板外部设置的。如果每个模板都使用相同的公用Configuration对象的单个模板处理的语言环境可以不同,则可以在freemarker.core.Environment对象上为每个模板分别进行设置。如果由于某种原因必须在模板内设置语言环境,那也是可能的:

<#setting locale="vi_VN">
${"CN, 15 thg 7 2018 18:54:00 +0700"?datetime("EEE, dd MMM yyyy hh:mm:ss zzz")}

还要注意,我使用的是?datetime,而不是?date。最后一个表示仅 日期,这可能会导致其他地方出现故障,因为您在那里也有时间。

答案 3 :(得分:0)

https://gsmblog.net/date-objects-liferay-freemarker-web-content-templates/

好像这个错误是由liferay处理得很差的。

我在这里用代码解决了:

<#-- Retrieve the published date meta data field of the web content -->
<#assign articleDisplayDate = .vars['reserved-article-display-date'].data />

<#-- Save the original page locale for later -->
<#assign originalLocale = locale>

<#-- Set the page locale to the portals default locale -->
<#setting locale = 'en_US'>

<#-- Parse the date to a date object use locale en-US -->
<#assign date = articleDisplayDate?date("EEE, dd MMM yyyy hh:mm:ss zzz")>

<#-- Create date time formart use originalLocale (Your site localle)  -->
<#assign dateTimeFormat = languageUtil.get(originalLocale, "MMMM, dd yyyy")>

<#-- Result  -->
<#assign date = date?string(dateTimeFormat)>