我正在尝试使用整数格式化日期,但它们单独工作都很好,但是当我将它们放在一起时,它会抛出以下错误。
Exception in thread "main" java.util.IllegalFormatConversionException: d != java.util.Date
at java.util.Formatter$FormatSpecifier.failConversion(Unknown Source)
at java.util.Formatter$FormatSpecifier.printInteger(Unknown Source)
at java.util.Formatter$FormatSpecifier.print(Unknown Source)
at java.util.Formatter.format(Unknown Source)
at java.util.Formatter.format(Unknown Source)
at java.lang.String.format(Unknown Source)
at Test.main(Test.java:10)
代码:
public class Test {
public static void main(String[] args) {
String format = "http://az.website.com/api/calendar/date/%1$tY-%1$tm-%1$te/user_id/%d";
Date date = Calendar.getInstance().getTime();
System.out.println(String.format(format, date, 23));
}
}
如果我删除日期格式%1$tY-%1$tm-%1$te
,那么它开始正常工作,但一起抛出IlelgalFormatConversionExpception
。
这段代码有什么问题?
更新
运行但产生错误输出的代码。
public class Test {
public static void main(String[] args) {
String format = "http://az.website.com/api/calendar/date/%1$tY-%1$tm-%1$te/user_id/%2$%d";
Date date = Calendar.getInstance().getTime();
System.out.println(String.format(format, date) + 23);
}
}
输出:http://az.website.com/api/calendar/date/2014-01-30/user_id/%d23
产生错误的代码:
public class Test {
public static void main(String[] args) {
String format = "http://az.website.com/api/calendar/date/%1$tY-%1$tm-%1$te/user_id/%2$d";
Date date = Calendar.getInstance().getTime();
System.out.println(String.format(format, date) + 23);
}
}
输出:
Exception in thread "main" java.util.MissingFormatArgumentException: Format specifier '2$d'
at java.util.Formatter.format(Unknown Source)
at java.util.Formatter.format(Unknown Source)
at java.lang.String.format(Unknown Source)
at Test.main(Test.java:10)
使用Java 1.6 Android 4.3也尝试过
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
更新 @Sotirios Delimanolis 确实是一个救星。我错误地调用了该方法。 错误 --> System.out.println(String.format(format, date) + 23);
右 --> System.out.println(String.format(format, date, 23));
最佳答案
使用 2$ 添加对参数列表中第二个参数的引用
String format = "http://az.website.com/api/calendar/date/%1$tY-%1$tm-%1$te/user_id/%2$d";
String.format(...)
内部使用 Formatter
javadoc 指出
The argument index is a decimal integer indicating the position of the argument in the argument list. The first argument is referenced by "1$", the second by "2$", etc.
关于Java String.format 无法完全格式化日期和整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21447959/