0

我想格式化一个日期以包含一个特殊的“一天中的一部分”指示符 - 例如“午夜”表示小时 = 0,“上午”表示 0<小时<12,“中午”表示小时 = 12 和“下午”小时> 12。

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

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

4

1 回答 1

2

我将 aChoiceFormat用于自定义输出,aDateFormat用于其余部分。这可以使用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
于 2013-11-08T08:56:50.947 回答