2013-03-15 1 views
3

Могу ли я как-то форматировать дату так, как это делает g: formatDate, но в Service? В том числе i18n и l10n?g: formatDate альтернатива в сервисе

Это может быть не самая лучшая практика для этого в службе, поскольку это должно быть скорее частью логики представления, но мне нужно вернуть дату как часть ответа JSON, и я не хочу чтобы справиться с этим в JS (главным образом из-за l10n).

Благодарим за консультацию.

+0

Вы можете использовать тот же метод FormatDate от вас, если контроллер будем. Вот сообщение, объясняющее это. [здесь] (https://stackoverflow.com/questions/7095086/grails-date-format-in-english-language) Также, если вам нужно это от службы, вы все равно можете получить доступ к g, используя метод, описанный здесь [https : //stackoverflow.com/questions/1777640/using-g-render-in-a-grails-service) – Alidad

+0

Возможно, можно использовать теги g. * от Controller. Однако теги-агенты AFAIK не могут использоваться из служб - и сейчас мне нужно гораздо больше (я удалю контроллер из вопроса). Спасибо в любом случае – pseudo

+0

посмотрите это сообщение для доступа к g в службе, если вы действительно хотите использовать formatDate http://stackoverflow.com/questions/1777640/using-g-render-in-a-grails-service – Alidad

ответ

0

У вас есть несколько вариантов здесь, которые не связаны с привлечением компонента tagLib из приложения grails.

Вариант 1: Если вы не слишком беспокоятся о i18n формат даты в службе, используя стандартные методы заводной.

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 ^^^ 

Это получает локаль, связанную с текущим потоком, если таковой имеется, или по умолчанию по умолчанию для 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) 

Затем вы можете использовать g.formatDate в myTagLib

+0

Существуют и другие варианты, форматирование даты в контроллере, как упомянуто выше, является одним из них. – chim

0

Вы можете использовать FormatDate в службе или такой же контроллер:

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