Использование симпатичной библиотеки времени для отображения времени в удобочитаемом формате в формате 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.

Другие вопросы по тегам