我能否以类似于 g:formatDate 标签的方式格式化日期,但在服务中?包括i18n和l10n?
在服务中执行此操作可能不是最佳实践,因为这更可能是视图逻辑的一部分,但我需要返回一个日期作为 JSON 响应的一部分,我不想处理这个在 JS 中(主要是因为 l10n)。
谢谢你的建议。
我能否以类似于 g:formatDate 标签的方式格式化日期,但在服务中?包括i18n和l10n?
在服务中执行此操作可能不是最佳实践,因为这更可能是视图逻辑的一部分,但我需要返回一个日期作为 JSON 响应的一部分,我不想处理这个在 JS 中(主要是因为 l10n)。
谢谢你的建议。
您可以在这样的服务或控制器中使用 formatDate:
g.formatDate( date: new Date(), type: "date", style:"MEDIUM" )
编辑: 在服务中不起作用
这里有几个选项,不涉及从 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