"%tB"格式化程序是如何工作的?

4
System.out.format("%tB",12);

我应该得到一个"December"的结果,但是却出现了一个异常。
Exception in thread "main" java.util.IllegalFormatConversionException: b != java.lang.Integer

这意味着我使用的语法是错误的。 我找不到任何在线上解释 %tB 格式命令的参考资料。 有人可以帮忙澄清一下吗? 先提前感谢。


你的提问方式很棒!为此加一分。 - Sri Krishna
2个回答

5

根据Formatter文档

日期/时间 - 可应用于能够编码日期或时间的Java类型:longLongCalendarDate

您可以使用长整型,例如12L,来消除异常。但请注意格式化程序期望日期的整数表示(即具有毫秒精度的Unix时间戳)。

为了获得所需内容,您可以尝试在1970年某个月中间手动构建一个近似的时间戳:

int month = 12;
int millisecondsInDay = 24*60*60*1000;
long date = ((month - 1L)*30 + 15)*millisecondsInDay;
System.out.format("%tB", date);

或者简单地使用一个 Date 对象:

System.out.format("%tB", new Date(0, 12, 0));

请注意,您可以在不使用Formatter的情况下完成相同的操作。
java.text.DateFormatSymbols.getInstance().getMonths()[12-1];

请参阅DateFormatSymbols以获取更多信息。


哦,这很有趣。直接来自Oracle教程:“tB将整数格式化为特定于区域设置的月份名称。” 参考http://docs.oracle.com/javase/tutorial/essential/io/formatting.html - Rollerball
嗨zakinster,你知道有什么参考资料可以更好地理解Java格式化程序吗?我在Javadoc或任何Oracle教程中都没有找到详细的内容。 - Rollerball
@Rollerball 看起来是一个相当错误或至少是误导性的句子。 - zakinster
在同一网站上,http://docs.oracle.com/javase/tutorial/java/data/numberformat.html非常详尽且不会误导。 - zakinster
@Rollerball Oracle教程是正确的,格式化程序可以处理整数,但只能是long类型,并且必须表示一个具有毫秒精度的Unix时间戳。 - zakinster

2

一个示例程序

import java.util.Calendar;
import java.util.Formatter;

public class MainClass {
  public static void main(String args[]) {
    Formatter fmt = new Formatter();
    Calendar cal = Calendar.getInstance();

    fmt.format("Today is day %te of %<tB, %<tY", cal);
    System.out.println(fmt);
  }
}

嗨Satya,你知道有什么参考资料可以更好地理解Java格式化程序吗?我在Javadoc或任何Oracle教程中都没有找到详细的内容。 - Rollerball
1
@Rollerball 好吧,这份Javadoc几乎涵盖了所有内容:http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html - bezmax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接