带有日期和月份的Java printf

System.out.printf("Time: %d-%d %02d:%02d" + calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.MONTH), calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE); 

这是朋友给我看的代码,但是如何让日期以11月1日的格式显示?

这是怎么做的:

 DateFormat dateFormat = new SimpleDateFormat( "MMMMM d" ); Calendar calendar = new GregorianCalendar(); // The date you want to format Date dateToFormat = calendar.getTime(); String formattedDate = dateFormat.format( dateToFormat ); System.out.println( formattedDate ); 
 Date d = new Date(); System.out.printf("%s %tB % 
  • 特定于区域设置的完整月份名称的%tB ,例如“1月”,“2月”。
  • d表示日期,格式为两位数,必要时带前导零, <用于重复使用最后一个参数。

DateFormat答案是这样做的方法。 printf答案也很好,虽然不提供特定于语言环境的格式(它提供特定于语言的名称,但不使用例如当前语言环境使用的日/月/年排序)。

你在评论中问道:

我可以使用calendar.get(Calendar.MONTH)等方法吗? 或者我必须使用日期格式?

您不必在此处使用其他方法,但如果您要使用Calender字段,则可以将它们提供的数值转换为“星期二”或“十一月”等字符串。 为此,您可以使用内置的DateFormatSymbols ,它以String数组的forms提供日期数字的国际化字符串,您可以使用Calendar字段索引到。 请参阅如何在Java中将整数转换为本地化月份名称? 例如。

请注意,您可以使用DateFormat.getDateInstance()来检索当前区域设置的预制格式(请参阅其他文档,还有获取预制时间或日期+时间格式的方法)。

基本上你有以下选择:

  • DateFormat (自定义格式的SimpleDateFormat
    • 特定于区域设置的格式(例如,日/月/年订购):是
    • 特定语言的名称(例如英语“November”与西class牙语“Noviembre”):是的
    • 适合你的工作:是的。 这是最好的方式,它将提供用户习惯使用的格式,而不需要您的逻辑。
  • printf日期字段
    • 特定于区域设置的格式:否
    • 特定语言的名称:是的
    • 适合您的工作:部分(由您决定现场订购)
  • DateFormatSymbols Calendar字段
    • 特定于区域设置的格式:否
    • 特定语言的名称:是的
    • 适合你的工作:不
  • 具有您自己的字符串转换的Calendar字段(如大switch语句):
    • 特定于区域设置的格式:否
    • 特定语言的名称:没有
    • 适合你的工作:不

基于DateFormat的格式与printf日期字段的另一个优点是你仍然可以使用SimpleDateFormat定义自己的字段排序和格式(就像printf一样),但是你可以坚持使用DateFormat接口,这样可以更容易地传递并与库存日期相结合格式如DateFormat.getDateInstance(DateFormat.MEDIUM)

查看DateFormat的文档,了解可以使用它执行的操作的信息。 有关创建自定义日期格式的信息,请查看SimpleDateFormat的文档 。 如果您想要即时满足,请查看这个日期格式 ( 存档 )的好例子,以获得一些示例输出。

有一个直接的方法如何使用printf来做,但它也是一个痛苦:

 String.printf("Time: %1$td-%1$tm %1$tH:%1$tM", new Date()); 

它的一个问题是它使用4个格式化字符串和相同的对象,因此它需要1$前缀来始终访问第一个参数。 另一个是我永远不会记得什么字母意味着什么(但也许这只是我)。

如果你关心,速度实际上可能是另一个问题。

这在底层类Formatter中有记录 。


我喜欢的方式是这样的

 myFormatter.format("Time: [dm HH:MM]", new Date()) 

大括号会使我们不再重复$1并明确争论结束的位置。