如何用ICU包将英文日期格式化为指定日本年号格式R010501
解决ICU JapaneseCalendar日期格式化补零问题
我来帮你搞定这个日期格式化的问题!你现在得到R151而不是预期的R010501,核心原因是用了预定义的SHORT格式——这种样式会自动省略数字的前导零,而且默认输出的是无分隔符但无补零的年号+月+日组合。要实现带前导零的格式,咱们需要抛弃预定义样式,改用自定义日期格式模式。
修正后的代码
import com.ibm.icu.text.SimpleDateFormat; import com.ibm.icu.util.JapaneseCalendar; import java.util.Date; import java.util.Locale; public class JapaneseDateFormatter { public static void main(String[] args) throws Exception { // 解析输入的公历日期 Date dtEngDate = new java.text.SimpleDateFormat("yyyy-MM-dd").parse("2019-05-01"); // 直接使用ICU的SimpleDateFormat,指定日本日历和自定义格式 SimpleDateFormat japaneseDateFormat = new SimpleDateFormat( "GyMMdd", Locale.JAPAN, new JapaneseCalendar() ); // 格式化并输出结果 String formattedDate = japaneseDateFormat.format(dtEngDate); System.out.println("today is: " + formattedDate); } }
关键细节解释
- 自定义格式
GyMMdd的作用:G:输出日本年号的缩写符号(令和对应R,平成对应H)y:输出年号的年份,ICU会自动补零为两位数字(令和1年就变成01)MM:强制输出两位月份(5月转为05)dd:强制输出两位日期(1号转为01)
- 相比之前用
Calendar.getDateTimeFormat的方式,直接实例化SimpleDateFormat并传入JapaneseCalendar,能更精准地控制输出格式,完全避免预定义样式的局限性。 - 现在也不需要再调用
replaceAll("/", "")了,因为自定义模式不会生成任何分隔符。
运行结果
执行这段代码后,你会得到预期的输出:
today is: R010501
内容的提问来源于stack exchange,提问作者Amit Unakal




