4

我能否以类似于 g:formatDate 标签的方式格式化日期,但在服务中?包括i18n和l10n?

在服务中执行此操作可能不是最佳实践,因为这更可能是视图逻辑的一部分,但我需要返回一个日期作为 JSON 响应的一部分,我不想处理这个在 JS 中(主要是因为 l10n)。

谢谢你的建议。

4

2 回答 2

1

您可以在这样的服务或控制器中使用 formatDate:

g.formatDate( date: new Date(), type: "date", style:"MEDIUM" )

编辑: 在服务中不起作用

于 2017-12-12T09:38:24.480 回答
0

这里有几个选项,不涉及从 grails 应用程序中拉入 tagLib bean。

选项 1: 如果您不太担心 i18n 使用默认的 groovy 方法格式化服务中的日期。

static final String DATE_FORMAT = 'dd-MM-yyyy'
// ...
Date date = new Date()
String formattedDate = date.format(DATE_FORMAT)

(这就是你所需要的,没有额外的进口)

选项2: 如果你担心i18n,仍然想在服务中格式化日期,那么你可以得到默认的日期格式

但首先你需要在服务中获取语言环境,(这是警钟应该开始响起的地方)

// Don't do this...
import org.springframework.context.i18n.LocaleContextHolder;
// ...
String locale = LocaleContextHolder.getLocale()
// Don't do that ^^^

这将获取与当前线程关联的区域设置(如果有)或系统默认区域设置。但是我们想要请求或会话中的用户语言环境。

(那些警钟现在应该加入红色闪光灯)

但是,如果您确实想这样做,请通过方法调用从控制器传递请求。

然后你可以使用

import org.springframework.web.servlet.support.RequestContextUtils
// ...
def locale = RequestContextUtils.getLocale(request)

所以我们有了语言环境,现在我们可以得到消息

// include the grailsApplication bean in the service
def grailsApplication
// ...

// Get the date format
def dateFormat = grailsApplication.mainContext.getMessage('default.date.format', null, 'dd-MM-yyyy', locale)

// Then you can use the groovy default method
String formattedDate = date.format(dateFormat)

不要使用静态方法在服务中获取请求。如果你这样做,警钟和闪烁的红灯将伴随着你所在的建筑物的剧烈震动。只需从控制器传递它。

选项 3: 在视图中格式化日期

<g:set var="formattedDate" value="${g.formatDate(date: date)}" />

这无疑是最简洁的方法,但有时您不使用模板来返回输出。

选项 4:

获取服务中的数据后,使用 tagLib 并从控制器输出。例如

def model = service.getModel()
def output = myTagLib.myOutputHtmlMethod(model)

然后你可以在 myTagLib 中使用 g.formatDate

于 2017-01-26T11:16:19.710 回答