我能以某种方式格式化日期,方式与g:formatDate标签的方式相似,但在服务中?包括i18n和l10n?
在服务中执行此操作可能不是最佳做法,因为这应该更有可能是视图逻辑的一部分,但我需要返回一个日期作为JSON响应的一部分,我不想在JS处理这个问题(主要是因为l10n)。
感谢您的建议。
答案 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