Использование симпатичной библиотеки времени для отображения времени в удобочитаемом формате в формате JSF
Мне довелось использовать симпатичное время 1.0.6 для отображения интервала между двумя точками во времени в удобочитаемом формате.
Есть встроенный конвертер JSF,
com.ocpsoft.pretty.time.web.jsf.PrettyTimeConverter
но поддерживает только java.util.Date
объекты.
Я случайно использовал следующий конвертер для org.joda.time.DateTime
@ManagedBean
@ApplicationScoped
public final class PrettyJodaTimeConverter extends PrettyTimeConverter
{
@Override
public String getAsString(final FacesContext context, final UIComponent component, final Object value)
{
if (value instanceof DateTime) {
return super.getAsString(context, component, ((DateTime) value).toDate());
} else {
return super.getAsString(context, component, value);
}
}
}
Это отображает интервал, например, "4 часа назад" на <h:outputText>
, например
<h:outputText value="#{productInquiryManagedBean.lastInquiry}"
converter="#{prettyJodaTimeConverter}"/>
Но мне нужно отобразить сообщение на <p:growl>
(или же <p:messages>
, <h:messages>
) на основе условной проверки в управляемом компоненте JSF. Поэтому этот конвертер не может быть использован (пожалуйста, предложите, если он может быть использован). Вместо этого мне нужно вручную отформатировать его в рассматриваемом bean-компоненте следующим образом:
private DateTime lastInquiry;
private String emailId;
private Product product;
if(productInquiryService.isPeriodExpired(30, emailId, product))
{
lastInquiry=productInquiryService.getDateTimeOfLastInquiry(email, product);
Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
PrettyTime time=new PrettyTime(lastInquiry.toDate(), locale);
time.setLocale(locale);
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, Utility.getMessage("faces.message.error"), Utility.getMessage("inquiry.min.time.expire", time.format(new Date()))));
}
Это отображает сообщение на <p:growl>
как - "Вы сделали запрос через 4 часа".
Можно ли изменить формат этого сообщения на "Вы сделали запрос 4 часа назад" в точности так, как показано на <h:outputText>
как показано выше?
Кроме того, отображаемый здесь формат интервала не локализован для конкретного местоположения из пакета ресурсов. Кажется, он всегда использует локаль по умолчанию. Сообщение, созданное PrettyTime#format()
должны быть локализованы.
Я передавал неверные параметры конструктору. Отсюда и неправильное сообщение о будущем времени. Они должны быть похожими на следующие.
PrettyTime time=new PrettyTime(new Date(), locale);
time.format(lastInquiry.toDate());
//lastInquiry is fetched from the database which a customer made an inquiry on.
Теперь он отображает правильный (прошедшее время) формат, например "4 часа назад".
Что касается локали, которую я искал, был HI
(на самом деле hi_IN
, Хинди в Индии) недоступен в ресурсах (в com.ocpsoft.pretty.time.i18n
пакет), поставляемый в библиотеке, хотя он упоминается в разделе поддержки i18n и нескольких языков.
1 ответ
Я передавал неверные параметры конструктору. Отсюда и неправильное сообщение о будущем времени. Они должны быть похожими на следующие.
PrettyTime time=new PrettyTime(new Date(), locale);
time.format(lastInquiry.toDate());
//lastInquiry is fetched from the database which a customer made an inquiry on.
Язык HI
(для хинди) и многие другие доступны в последней финальной версии 3.2.5.
Преобразователь JSF,
com.ocpsoft.pretty.time.web.jsf.PrettyTimeConverter
был переупакован в
org.ocpsoft.prettytime.jsf.PrettyTimeConverter
и был перемещен в отдельный файл JAR Prettytime-интеграции-JSF.
В дополнение к основному файлу JAR этот файл JAR также необходим, если вы хотите использовать этот конвертер в JSF.