Java 21中DateFormat.format()输出含无效字节问题求助
问题分析与解决方案
这个问题是由于Java 21默认使用的CLDR本地化数据源中,当前默认Locale的AM/PM标记包含输出环境不支持的字符,导致字符无法正确渲染,显示为问号。以下是几种解决方式:
1. 指定明确的Locale
通过指定已知字符兼容的Locale(如Locale.US),避免依赖默认Locale的不确定性:
import java.util.Date; import java.text.DateFormat; import java.util.Locale; class DateTime { public static void main(String[] args) { String dt = DateFormat.getDateTimeInstance( DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.US ).format(new Date()); System.out.println(dt); } }
2. 确保输出环境的字符编码支持UTF-8
启动Java程序时显式指定文件编码为UTF-8,适配终端的字符编码设置:
java -Dfile.encoding=UTF-8 DateTime
3. 改用Java 8+推荐的java.time日期API
旧的DateFormat和Date类存在线程不安全、本地化处理不够灵活等问题,Java 8及以后推荐使用java.time包的API,它的本地化支持更稳定:
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Locale; class DateTime { public static void main(String[] args) { LocalDateTime now = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MMM d, yyyy, h:mm:ss a", Locale.US ); String dt = now.format(formatter); System.out.println(dt); } }
补充说明
Java 9之后默认采用CLDR作为本地化数据源,相比旧版JRE的本地化数据,CLDR提供了更符合国际标准的本地化符号,但部分符号可能使用了终端默认编码不支持的字符,从而出现问号替代的情况。指定明确Locale或切换到java.timeAPI是更可靠的解决方式。
内容的提问来源于stack exchange,提问作者Spencer Shellman
相关产品推荐
相关产品推荐

