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

Android中正确创建Date对象及获取MMM格式月份的方法

Android 日期处理常见问题解答

Hey there! Let's break down your questions about date handling on Android step by step:

1. Android平台中正确创建Date对象的方式,以及你的写法是否合规

首先明确:你给出的「Date date = new Date, date = 1995/06/10」这种写法完全不合规,原因有两点:

  • 语法错误:逗号不能用来分隔变量声明和赋值,而且1995/06/10是数值运算(1995÷6÷10=33.25),根本不是日期格式,无法直接赋值给Date对象。
  • 即使修正语法,Date类也没有接受这种字符串参数的构造函数,而且旧的Date构造函数(比如new Date(int year, int month, int day))已经被标记为过时,存在设计缺陷,不推荐使用。

下面是两种正确的创建方式:

方式一:使用现代java.time API(推荐,API 26+ 或兼容低版本)

Android从API 26开始原生支持java.time包(Java 8引入的现代日期时间API),它比旧的Date/Calendar/SimpleDateFormat更安全、易用,还支持线程安全。如果你的项目需要兼容API 26以下的版本,可以引入ThreeTenABP库来使用这套API。

创建指定日期的示例代码:

// 创建1995年6月10日的日期对象(LocalDate只包含日期,不含时间)
LocalDate localDate = LocalDate.of(1995, 6, 10);
// 如果需要转换为传统的Date对象(兼容旧代码场景)
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

方式二:使用传统SimpleDateFormat(兼容旧版本,不推荐)

如果必须使用旧API,需要通过SimpleDateFormat将字符串解析为Date对象:

try {
    // 定义日期格式,注意要和输入字符串的格式匹配
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd", Locale.getDefault());
    Date date = sdf.parse("1995/06/10");
} catch (ParseException e) {
    // 处理解析失败的情况
    e.printStackTrace();
}

⚠️ 提醒:SimpleDateFormat是线程不安全的,多线程环境下不要共享同一个实例。

2. 提取月份(包括数字月份和「MMM」格式的月份)

提取数字月份(1-12)

现代API方式:

LocalDate localDate = LocalDate.of(1995, 6, 10);
int month = localDate.getMonthValue(); // 直接返回6
// 也可以获取月份枚举类型,再取数值
Month monthEnum = localDate.getMonth(); // 返回Month.JUNE
int monthValue = monthEnum.getValue(); // 同样返回6

传统API方式:

注意Calendar类的月份是从0开始计数的(0代表1月),所以需要加1才能得到1-12的正确数值:

try {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd", Locale.getDefault());
    Date date = sdf.parse("1995/06/10");
    
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    int month = calendar.get(Calendar.MONTH) + 1; // 返回6
} catch (ParseException e) {
    e.printStackTrace();
}

获取「MMM」格式的月份(如英文"Jun"、中文"六月")

「MMM」代表本地化的月份缩写,不同Locale下会显示对应语言的缩写。

现代API方式:

使用DateTimeFormatter(线程安全):

LocalDate localDate = LocalDate.of(1995, 6, 10);
// 获取系统默认Locale的月份缩写
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM", Locale.getDefault());
String monthAbbr = localDate.format(formatter); // 中文环境返回"六月",英文返回"Jun"

// 强制使用特定Locale,比如英文
DateTimeFormatter enFormatter = DateTimeFormatter.ofPattern("MMM", Locale.ENGLISH);
String enMonthAbbr = localDate.format(enFormatter); // 固定返回"Jun"

传统API方式:

用SimpleDateFormat指定「MMM」格式:

try {
    SimpleDateFormat sdfParse = new SimpleDateFormat("yyyy/MM/dd", Locale.getDefault());
    Date date = sdfParse.parse("1995/06/10");
    
    // 格式化月份为MMM格式
    SimpleDateFormat sdfFormat = new SimpleDateFormat("MMM", Locale.getDefault());
    String monthAbbr = sdfFormat.format(date);
    
    // 强制英文缩写
    SimpleDateFormat enSdf = new SimpleDateFormat("MMM", Locale.ENGLISH);
    String enMonthAbbr = enSdf.format(date); // 返回"Jun"
} catch (ParseException e) {
    e.printStackTrace();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:54:27