如何在java中实现自定义日期格式?

时间:2013-11-08 08:41:50

标签: java date-formatting

我想格式化日期以包含特殊的“部分日期”指示符 - 例如“午夜”表示小时= 0,“是”表示0 <小时&lt; 12,“中午”表示小时= 12和“pm”表示小时&gt; 12。

由于SimpleDateFormat没有这样的功能,我该如何实现呢?我可以将SimpleDateFormat用于其余的格式并分别完成部分工作,但这涉及创建一个新的Calendar对象,计算一天中的部分并将结果拼接在一起。这感觉非常尴尬和低效。

理想情况下,我想将我的“部分日期”格式化程序“插入”SimpleDateFormat或其他日期格式化程序(如果joda-time可以,我也很感兴趣)。

1 个答案:

答案 0 :(得分:2)

我会使用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