0
点赞
收藏
分享

微信扫一扫

Java中Date工具类

半夜放水 04-27 06:00 阅读 28

在Java中,处理日期和时间的工具类经历了多次演进。以下是关键工具类的使用指南,按推荐顺序排列:

  1. 推荐方案:Java 8+ 的 java.time 包(JSR 310) Java 8引入了全新的日期时间API,解决了旧版类的线程安全和易用性问题。 常用类:

LocalDate:日期(年-月-日,无时区) LocalTime:时间(时-分-秒-纳秒,无时区) LocalDateTime:日期+时间(无时区) ZonedDateTime:带时区的日期时间 Instant:时间戳(UTC时区,适合机器时间) Duration/Period:时间间隔计算

核心操作示例: java// 获取当前日期LocalDate today = LocalDate.now(); // 创建指定日期LocalDate specificDate = LocalDate.of(2023, 10, 25); // 日期加减LocalDate nextWeek = today.plusDays(7);LocalDate lastMonth = today.minusMonths(1); // 日期比较boolean isAfter = today.isAfter(specificDate); // 格式化/解析DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");String formatted = today.format(formatter);LocalDate parsedDate = LocalDate.parse("2023-10-25", formatter); // 时区处理ZonedDateTime nyTime = ZonedDateTime.now(ZoneId.of("America/New_York")); // 时间间隔计算Duration duration = Duration.between(startInstant, endInstant);Period period = Period.between(startDate, endDate);

  1. 旧版类(不推荐新项目使用) java.util.Date

可变对象,线程不安全 包含日期和时间(精确到毫秒) 月份从0开始(0=1月)

javaDate oldDate = new Date();long timestamp = oldDate.getTime(); // 获取时间戳 java.util.Calendar

解决部分日期计算问题,但仍存在设计缺陷 月份从0开始

javaCalendar cal = Calendar.getInstance();cal.set(2023, Calendar.OCTOBER, 25); // 注意月份参数是9 格式化工具:java.text.SimpleDateFormat

线程不安全,需每次创建新实例

javaSimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String dateStr = sdf.format(new Date());

  1. 转换新旧API java// Date -> LocalDateTimeDate oldDate = new Date();LocalDateTime newDateTime = oldDate.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); // LocalDate -> DateLocalDate localDate = LocalDate.now();Date newDate = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
  2. 第三方工具库(补充场景) Apache Commons Lang DateUtils java// 安全日期计算Date tomorrow = DateUtils.addDays(new Date(), 1); // 截断时间Date truncatedDate = DateUtils.truncate(new Date(), Calendar.DATE); Joda-Time(历史遗留项目)

Java 8前的事实标准,现已被官方API取代

最佳实践建议:

新项目优先使用java.time包,线程安全且API更直观 处理时区时明确指定ZoneId,避免隐式转换 格式化时使用DateTimeFormatter(线程安全)替代SimpleDateFormat 需要兼容旧代码时,使用转换方法进行过渡

示例:计算两个日期之间的天数差 javaLocalDate start = LocalDate.of(2023, 1, 1);LocalDate end = LocalDate.of(2023, 10, 25);long daysBetween = ChronoUnit.DAYS.between(start, end); // 输出 297

举报

相关推荐

0 条评论