2013-11-08 3 views
0

Я хотел бы отформатировать дату, чтобы включить специальный индикатор «часть дня» - например, «полночь» в течение часа = 0, «am» для 0 < час < 12, «полдень» для часа = 12 и " pm "за час > 12.Как реализовать пользовательский формат даты в java?

Поскольку SimpleDateFormat не имеет такой функции, как ее реализовать? Я мог бы использовать SimpleDateFormat для остальной части формата и выполнять часть дня отдельно, но это связано с созданием нового объекта Calendar, вычисления части дня и сшивания результатов вместе. Это кажется довольно неудобным и неэффективным.

В идеале я хотел бы «подключить» формуляр «часть дня» в SimpleDateFormat или какой-либо другой формат даты (если это возможно с joda-временем, мне тоже интересно).

+0

Вы можете использовать 'ChoiceFormat' в сочетании с' DateFormat' с помощью магии в 'MessageFormat'. –

+0

@BoristheSpider вы могли бы расширить его и написать в качестве ответа? – aditsu

ответ

1

Я бы использовал ChoiceFormat для пользовательского вывода и DateFormat для отдыха. Это можно комбинировать довольно элегантно, используя MessageFormat.

final String format = "{0,choice,0#midnight|0<am|12#noon|12<pm} {1,date,dd MMM YYYY HH:mm:ss}"; 
    final MessageFormat messageFormat = new MessageFormat(format); 

Пример:

public static void main(String args[]) { 
    final Calendar calendar = Calendar.getInstance(); 
    final String format = "{0,choice,0#midnight|0<am|12#noon|12<pm} {1,date,dd MMM YYYY HH:mm:ss}"; 
    final MessageFormat messageFormat = new MessageFormat(format); 

    System.out.println(messageFormat.format(new Object[]{calendar.get(Calendar.HOUR_OF_DAY), calendar.getTime()})); 
    System.out.println("==== TESTS ===="); 
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    System.out.println(messageFormat.format(new Object[]{calendar.get(Calendar.HOUR_OF_DAY), calendar.getTime()})); 
    calendar.set(Calendar.HOUR_OF_DAY, 1); 
    System.out.println(messageFormat.format(new Object[]{calendar.get(Calendar.HOUR_OF_DAY), calendar.getTime()})); 
    calendar.set(Calendar.HOUR_OF_DAY, 11); 
    System.out.println(messageFormat.format(new Object[]{calendar.get(Calendar.HOUR_OF_DAY), calendar.getTime()})); 
    calendar.set(Calendar.HOUR_OF_DAY, 12); 
    System.out.println(messageFormat.format(new Object[]{calendar.get(Calendar.HOUR_OF_DAY), calendar.getTime()})); 
    calendar.set(Calendar.HOUR_OF_DAY, 14); 
    System.out.println(messageFormat.format(new Object[]{calendar.get(Calendar.HOUR_OF_DAY), calendar.getTime()})); 
} 

Выход:

am 08 Nov 2013 08:53:58 
==== TESTS ==== 
midnight 08 Nov 2013 00:53:58 
am 08 Nov 2013 01:53:58 
am 08 Nov 2013 11:53:58 
noon 08 Nov 2013 12:53:58 
pm 08 Nov 2013 14:53:58 
+0

Не совсем такое решение, на которое я надеялся, но я думаю, что он более изящный, чем моя идея. Тем не менее, по-прежнему нужно иметь дело с отдельным объектом Calendar. – aditsu

+0

Предположительно вам понадобится объект 'Date' или' Calendar' для любого решения. Вставьте его в класс утилиты с помощью метода, который принимает или «Календарь» или «Дата» - абстракция является ключом к элегантности ... –

Смежные вопросы