You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:37:09