在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
相关产品推荐
相关产品推荐

