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

在Java(安卓)中如何自定义SimpleDateFormat的日期格式

Java(安卓)实现带序数后缀日期的方案

你直接照搬PHP的日期格式符会报错,是因为Java的SimpleDateFormat和PHP的date()函数的格式规则完全不通用:

  • Java没有j这个格式符,对应PHP里不带前导零的日期,Java用单个d即可
  • PHP里的S代表日期的序数后缀(st/nd/rd/th),但Java的S代表毫秒值,也没有内置的序数后缀格式符,需要自行实现
  • Java字符串里要写转义的点需要写成\\.,不过这不是核心报错原因

方案1:兼容低版本安卓的SimpleDateFormat实现

首先写一个工具方法生成带序数后缀的日期字符串,再拼接月份和年即可:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

// 生成带序数后缀的日期
private String getOrdinalDay(int day) {
    // 11、12、13特殊处理,统一用th
    if (day >= 11 && day <= 13) {
        return day + "th";
    }
    switch (day % 10) {
        case 1: return day + "st";
        case 2: return day + "nd";
        case 3: return day + "rd";
        default: return day + "th";
    }
}

// 调用生成最终日期
TimeZone tz = TimeZone.getTimeZone("Asia/Calcutta");
// 提取当日日期数字
SimpleDateFormat dayFormat = new SimpleDateFormat("d", Locale.ENGLISH);
dayFormat.setTimeZone(tz);
int day = Integer.parseInt(dayFormat.format(new Date()));
String dayWithSuffix = getOrdinalDay(day);
// 提取月份缩写和年份
SimpleDateFormat monthYearFormat = new SimpleDateFormat("MMM. yyyy", Locale.ENGLISH);
monthYearFormat.setTimeZone(tz);
String monthYear = monthYearFormat.format(new Date());
// 拼接得到最终结果,格式为 2nd Oct. 2021
String finalDate = dayWithSuffix + " " + monthYear;

方案2:推荐的java.time实现(API 26+ 或开启Desugar支持)

Android 8.0及以上、或是项目开启了Java 8+ desugar支持的话,更推荐用线程安全的java.time包实现,避免SimpleDateFormat的多线程问题:

import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

private String getOrdinalDay(int day) {
    if (day >= 11 && day <= 13) {
        return day + "th";
    }
    return switch (day % 10) {
        case 1 -> day + "st";
        case 2 -> day + "nd";
        case 3 -> day + "rd";
        default -> day + "th";
    };
}

// 调用生成最终日期
ZoneId zoneId = ZoneId.of("Asia/Calcutta");
LocalDate today = LocalDate.now(zoneId);
String dayWithSuffix = getOrdinalDay(today.getDayOfMonth());
DateTimeFormatter monthYearFormatter = DateTimeFormatter.ofPattern("MMM. yyyy", Locale.ENGLISH);
String monthYear = today.format(monthYearFormatter);
String finalDate = dayWithSuffix + " " + monthYear;

注意事项

  • 必须指定Locale.ENGLISH,否则月份缩写会跟随系统语言变化,无法输出Oct这种英文缩写
  • 时区要设置为和你PHP代码一致的Asia/Calcutta,保证两端日期结果一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:57:03