带日期和月份的Java printf

带日期和月份的Java printf,java,Java,这是一位朋友给我看的代码,但我如何让日期以11月1日这样的格式显示?这是如何做到的: 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); dated=新日

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

这是如何做到的:

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);
dated=新日期();
System.out.printf(“%s%tB%是实现此目的的方法。虽然没有提供特定于语言环境的格式,但也很好(它提供特定于语言的名称,但不使用当前语言环境使用的日/月/年顺序)

你问我:


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

您不必在此处使用其他方法,但如果要使用
日历
字段,则可以将它们提供的数值转换为字符串,如“星期二”或“十一月”。为此,您可以使用内置的,它以
字符串
数组的形式提供日期数字的国际化字符串,您可以使用
日历
字段索引到该数组。请参阅示例

注意:您可以使用来检索当前语言环境的预制格式(请参阅这些文档的其余部分,还有一些方法可以获取预制时间格式或日期+时间格式)

基本上,您有以下选项:

  • DateFormat
    SimpleDateFormat
    用于自定义格式)
    • 特定于区域设置的格式(例如,日/月/年排序):是
    • 特定语言名称(例如英语“十一月”与西班牙语“Noviembre”):是
    • 对你有用吗:是的。这是最好的方式,它将提供一种用户习惯使用的格式,而不需要你的逻辑
  • printf
    日期字段
    • 特定于区域设置的格式:否
    • 特定语言名称:是
    • 是否为您工作:部分(由您决定现场订单)
  • 日历
    带有
    日期格式符号的字段
    • 特定于区域设置的格式:否
    • 特定语言名称:是
    • 这对你有用吗
  • Calendar
    字段与您自己的字符串转换(如一个大的
    switch
    语句):
    • 特定于区域设置的格式:否
    • 特定语言名称:否
    • 这对你有用吗
基于
DateFormat
的格式与
printf
日期字段相比的另一个优点是,您仍然可以使用
SimpleDateFormat
定义自己的字段顺序和格式(就像
printf
)但是您可以坚持使用
DateFormat
界面,这样可以更容易地传递和组合股票日期格式,如
DateFormat.getDateInstance(DateFormat.MEDIUM)


查看以获取有关您可以使用它进行操作的信息。查看以获取有关创建自定义日期格式的信息。如果您想要即时满足,请查看此()以获取一些示例输出。

使用
printf
有一种直接的方法,但这也是一种痛苦:

Date d = new Date();
System.out.printf("%s %tB %<td", "Today",  d);
// output : 
//   Today november  01
它的一个问题是,它使用4个格式字符串与同一个对象,因此它需要
1$
前缀来始终访问第一个参数。另一个问题是,我永远记不起字母的含义(但可能这只是我)

如果你在意的话,速度实际上可能是另一个问题

这记录在底层类中


我喜欢的方式是

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

大括号可以使我们避免重复
$1
,并明确参数的结束位置。

将日期对象与SimpleDateFormat一起使用。这很痛苦……SDF是垃圾,
printf
。我编写了一个实用程序,允许编写
myFormatter.format(“Time:[d-m HH:MM]”,new Date())
并允许为相同或不同的类型插入其他格式字符串,但尚未发布。@maaartinus如果您能在回答中详细说明您在SDF中看到的问题,我相信这对许多读者都很有用。否则,OP只会留下“有人说SDF是垃圾,但我不知道为什么”的想法(我个人不同意)还有可能毫无理由地避免使用一个好的工具。@JasonC你是对的……虽然这个主题值得一个长篇大论,而不是一个一般的答案。我写了一个关于
printf
的答案。我们得到了一个糟糕的C函数重做,这是一件痛苦的事情。
SDF
不是问题的主题,但我对它的关注很简单:一个同时是非线程安全且成本高昂的创建是一个糟糕的组合。我可以使用calendar.get(calendar.MONTH)etc方法进行复制吗?或者我必须使用日期格式吗?
calendar.getTime()
为您提供一个
date
请参见@user2738201我已经更新了我的答案,添加了从日历中提取日期的方法
String.printf("Time: %1$td-%1$tm %1$tH:%1$tM", new Date());
myFormatter.format("Time: [d-m HH:MM]", new Date())