我想格式化日期以包含特殊的“部分日期”指示符 - 例如“午夜”表示小时= 0,“是”表示0 <小时&lt; 12,“中午”表示小时= 12和“pm”表示小时&gt; 12。
由于SimpleDateFormat没有这样的功能,我该如何实现呢?我可以将SimpleDateFormat用于其余的格式并分别完成部分工作,但这涉及创建一个新的Calendar对象,计算一天中的部分并将结果拼接在一起。这感觉非常尴尬和低效。
理想情况下,我想将我的“部分日期”格式化程序“插入”SimpleDateFormat或其他日期格式化程序(如果joda-time可以,我也很感兴趣)。
答案 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