Android日期工具类DateUtil怎么用?,有哪些方法?
- 云服务器
- 2026-07-25
- 8
核心功能
- 日期格式化:将 Date 对象转为指定格式字符串,或反向解析。
- 时间戳转换:毫秒值与 Date 对象、字符串之间的互转。
- 日期计算:加减年、月、周、日、时、分、秒。
- 日期比较:判断先后、相等,计算差值。
- 获取属性:提取年、月、日、星期、季度等。
常用方法表格
| 方法 | 参数 | 返回值 | 说明 |
|---|---|---|---|
| formatDate(Date date, String pattern) | Date, 格式 | String | 格式化日期 |
| parseDate(String str, String pattern) | 字符串, 格式 | Date | 解析字符串为日期 |
| millisToDate(long millis) | 毫秒值 | Date | 时间戳转日期 |
| dateToMillis(Date date) | Date | long | 日期转时间戳 |
| addDays(Date date, int days) | Date, 天数 | Date | 增加指定天数 |
| addMonths(Date date, int months) | Date, 月数 | Date | 增加指定月数 |
| getYear(Date date) | Date | int | 获取年份 |
| getMonth(Date date) | Date | int | 获取月份(0-11) |
| getDayOfWeek(Date date) | Date | int | 获取星期几(1=周日) |
| daysBetween(Date start, Date end) | 开始, 结束 | long | 计算间隔天数 |
| isBefore(Date d1, Date d2) | 两个日期 | boolean | 判断 d1 是否在 d2 之前 |
| isSameDay(Date d1, Date d2) | 两个日期 | boolean | 判断是否同一天 |
示例代码(Java)
public class DateUtil { private static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss"; // 格式化 public static String formatDate(Date date) { return formatDate(date, DEFAULT_PATTERN); } public static String formatDate(Date date, String pattern) { SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.getDefault()); return sdf.format(date); } // 解析 public static Date parseDate(String dateStr) { return parseDate(dateStr, DEFAULT_PATTERN); } public static Date parseDate(String dateStr, String pattern) { SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.getDefault()); try { return sdf.parse(dateStr); } catch (ParseException e) { e.printStackTrace(); return null; } } // 时间戳转换 public static Date millisToDate(long millis) { return new Date(millis); } public static long dateToMillis(Date date) { return date.getTime(); } // 日期加减 public static Date addDays(Date date, int days) { Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.DAY_OF_MONTH, days); return cal.getTime(); } public static Date addMonths(Date date, int months) { Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.MONTH, months); return cal.getTime(); } // 日期比较 public static boolean isBefore(Date d1, Date d2) { return d1.before(d2); } public static boolean isSameDay(Date d1, Date d2) { Calendar cal1 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); cal1.setTime(d1); cal2.setTime(d2); return cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR); } // 间隔天数 public static long daysBetween(Date start, Date end) { long diff = end.getTime() start.getTime(); return TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS); } }
注意事项
- SimpleDateFormat 非线程安全:在多线程环境中应避免使用静态实例,或使用 ThreadLocal、DateTimeFormatter(Java 8+)或三方库如 Joda-Time。
- 时区问题:使用 SimpleDateFormat 时需指定时区,尤其在跨时区应用中。
- 月份起始:Calendar.MONTH 从 0 开始,获取月份时应加 1 或使用 Calendar.JANUARY 等常量。
- Android 推荐:Android 项目中可使用 android.text.format.DateUtils 或 java.time 包(API 26+),也可使用 ThreeTenABP 向后兼容。
相关问题与解答
问题1:如何实现日期格式化,并处理时区?
解答:使用 SimpleDateFormat 时,通过 setTimeZone(TimeZone.getTimeZone("GMT+8")) 设置时区,若使用 Java 8+ 的 DateTimeFormatter,可结合 ZoneId,示例:


问题2:如何安全地计算两个日期之间的天数差,避免时区干扰?
解答:推荐使用 java.time 包(API 26+)中的 LocalDate,它不包含时区信息,直接计算天数差:

LocalDate start = LocalDate.of(2025, 1, 1); LocalDate end = LocalDate.now(); long days = ChronoUnit.DAYS.between(start, end);
若需兼容低版本,可先转换为 Date 对象,再使用 TimeUnit.DAYS.convert(end.getTime() start.getTime(), TimeUnit.MILLISECONDS),但需注意时区偏移可能影响结果,建议统一使用 UTC 时间。