g:服务中的formatDate替代方案

时间:2013-03-15 17:40:23

标签: date grails service date-format

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

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

感谢您的建议。

2 个答案:

答案 0 :(得分:1)

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

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

修改 在服务中不起作用

答案 1 :(得分: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并且仍想在服务中格式化日期,那么您可以获得默认日期格式

但首先你需要在服务中获取Locale(这是警钟响起的地方)

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

这将获取与当前线程(如果有)或其他系统默认Locale相关联的Locale。但我们需要来自请求或会话的用户区域设置。

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

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

然后你可以使用

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