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

Java处理法语日期序数词(1er)及JDateChooser集成问题求助

问题解决与代码优化建议

一、解决2号显示为2'的问题

你遇到的2'错误,根源是使用SimpleDateFormat时错误通过单引号转义处理后缀逻辑,导致非1号日期残留多余单引号。正确做法是单独提取日期的日部分,判断后拼接后缀,而非在格式化模式中嵌入单引号。

临时修复(基于现有SimpleDateFormat代码)

如果暂时不想替换旧API,可修改日期处理逻辑:

private String getDateAttestation(Date date) {
    if (date == null) return "";
    
    // 分别格式化星期、月份、年份
    SimpleDateFormat dayOfWeekFormat = new SimpleDateFormat("EEEE", Locale.FRENCH);
    SimpleDateFormat monthFormat = new SimpleDateFormat("MMMM", Locale.FRENCH);
    SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy", Locale.FRENCH);
    
    String dayOfWeek = dayOfWeekFormat.format(date);
    String month = monthFormat.format(date);
    String year = yearFormat.format(date);
    
    // 处理日部分的后缀
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    int day = cal.get(Calendar.DAY_OF_MONTH);
    String dayStr = day == 1 ? "1er" : String.valueOf(day);
    
    return String.format("%s %s %s %s", dayOfWeek, dayStr, month, year);
}

二、代码优化建议(推荐方案)

SimpleDateFormat是线程不安全的老旧API,建议替换为Java 8+引入的java.time包下的日期类,API更简洁安全,对本地化支持更完善。

优化后的完整实现

  1. 转换JDateChooser的Date为LocalDate:
Date selectedDate = jDateChooser.getDate();
if (selectedDate == null) {
    JOptionPane.showMessageDialog(null, "请选择日期");
    return;
}
// 将Date转换为LocalDate(适配Java 8+)
LocalDate localDate = selectedDate.toInstant()
                                 .atZone(ZoneId.systemDefault())
                                 .toLocalDate();
  1. 自定义法语日期格式化逻辑:
// 构建支持1er后缀的法语日期格式化器
DateTimeFormatter frenchDateFormatter = new DateTimeFormatterBuilder()
        // 格式化星期(如jeudi)
        .appendPattern("EEEE ")
        // 自定义日部分显示:1号为1er,其他直接显示数字
        .appendText(ChronoField.DAY_OF_MONTH, Map.of(1L, "1er"))
        // 格式化月份和年份(如décembre 2022)
        .appendPattern(" MMMM yyyy")
        .toFormatter(Locale.FRENCH);

// 生成最终格式化字符串
String formattedDate = localDate.format(frenchDateFormatter);
// 输出示例:jeudi 1er décembre 2022 / vendredi 2 décembre 2022

额外优化点

  • 单独封装日期格式化方法,提升代码复用性;
  • 固定使用Locale.FRENCH,避免依赖系统默认语言导致的本地化错误;
  • 添加空值判断(如JDateChooser未选日期的情况),避免空指针异常;
  • java.time下的DateTimeFormatter是线程安全的,多线程环境可全局复用,无需每次创建实例。

内容的提问来源于stack exchange,提问作者Jlort

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:45:32