java时间类-深入探究DateUtils的最佳实践

解锁Java时间操作的秘密武器:深入探究DateUtils的最佳实践

1、造轮子?只有工程师才会造轮子,所以我们都是工程师。
2、时间一个啥子东西呢,抓不住,留不住,但是我们可以记住。

前文回顾
1.为什么 Java 中的时间类如此繁多而复杂?

2.如何摆脱Java旧版时间类的困扰?Java 8新时间API带你轻松玩转时间

3.Java时间类- 还不会用Java8中java.time类选择使用场景吗?

4.Java时间类-java.time时间类常见操作工具集

我们基于java.time封装一个完整的 DateUtils 工具类,结合了之前提到的所有功能,支持多种常见的时间处理场景,并兼容 Date 类型和字符串类型的输入。

深入浅出探究其功能点

  1. 时间获取: 获取当前日期、时间或日期时间。
  2. 时间格式化: 支持将 LocalDateTime, LocalDate, LocalTime, Date 转换为指定格式的字符串,默认格式为 yyyy-MM-dd HH:mm:ss
  3. 字符串解析: 支持将字符串解析为 LocalDateTime, LocalDate, LocalTime,以及自动识别并处理 Date
  4. 日期时间加减: 支持对日期时间进行加减操作,包括天数、小时、分钟和秒数等,兼容 Date 和字符串输入。
  5. 时间区间计算: 计算两个时间点之间的时间差,可以是天数或秒数,兼容 Date 类型。
  6. 旧类 Date 的兼容: 提供 Datejava.time API 之间的转换,方便处理老的时间类。
  7. 时间戳操作: 获取当前时间戳,将时间戳转换为 LocalDateTime,或者将 LocalDateTime 转换为时间戳。

废话不多说,上代码,皇阿码

DateUtils 工具类

package com.example.utils;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;
/**
 * v 一周一志程序员
 * @author zhizhou   2024/10/09 16:07
 */
public class DateUtils {

    // 默认时间格式
    private static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    private static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    // 格式化器
    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT);
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT);
    private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT);

    // 获取当前时间
    public static LocalDateTime getCurrentDateTime() {
        return LocalDateTime.now();
    }

    public static LocalDate getCurrentDate() {
        return LocalDate.now();
    }

    public static LocalTime getCurrentTime() {
        return LocalTime.now();
    }

    // 日期转字符串
    public static String formatDateTime(LocalDateTime dateTime) {
        return dateTime.format(DATE_TIME_FORMATTER);
    }

    public static String formatDateTime(Date date) {
        return formatDateTime(toLocalDateTime(date));
    }

    public static String formatDate(LocalDate date) {
        return date.format(DATE_FORMATTER);
    }

    public static String formatDate(Date date) {
        return formatDate(toLocalDate(date));
    }

    public static String formatTime(LocalTime time) {
        return time.format(TIME_FORMATTER);
    }

    public static String formatTime(Date date) {
        return formatTime(toLocalDateTime(date).toLocalTime());
    }

    // 字符串转日期
    public static LocalDateTime parseDateTime(String dateTimeStr) {
        return LocalDateTime.parse(dateTimeStr, DATE_TIME_FORMATTER);
    }

    public static LocalDate parseDate(String dateStr) {
        return LocalDate.parse(dateStr, DATE_FORMATTER);
    }

    public static LocalTime parseTime(String timeStr) {
        return LocalTime.parse(timeStr, TIME_FORMATTER);
    }

    // 日期加减操作
    public static LocalDateTime addDays(LocalDateTime dateTime, long days) {
        return dateTime.plusDays(days);
    }

    public static LocalDateTime addDays(Date date, long days) {
        return addDays(toLocalDateTime(date), days);
    }

    public static LocalDateTime addHours(LocalDateTime dateTime, long hours) {
        return dateTime.plusHours(hours);
    }

    public static LocalDateTime addHours(Date date, long hours) {
        return addHours(toLocalDateTime(date), hours);
    }

    public static LocalDateTime addMinutes(LocalDateTime dateTime, long minutes) {
        return dateTime.plusMinutes(minutes);
    }

    public static LocalDateTime addMinutes(Date date, long minutes) {
        return addMinutes(toLocalDateTime(date), minutes);
    }

    public static LocalDateTime addSeconds(LocalDateTime dateTime, long seconds) {
        return dateTime.plusSeconds(seconds);
    }

    public static LocalDateTime addSeconds(Date date, long seconds) {
        return addSeconds(toLocalDateTime(date), seconds);
    }

    // 时间区间计算
    public static long betweenDates(LocalDate startDate, LocalDate endDate) {
        return ChronoUnit.DAYS.between(startDate, endDate);
    }

    public static long betweenDates(Date startDate, Date endDate) {
        return betweenDates(toLocalDate(startDate), toLocalDate(endDate));
    }

    public static long betweenDateTimes(LocalDateTime startDateTime, LocalDateTime endDateTime) {
        return ChronoUnit.SECONDS.between(startDateTime, endDateTime);
    }

    public static long betweenDateTimes(Date startDateTime, Date endDateTime) {
        return betweenDateTimes(toLocalDateTime(startDateTime), toLocalDateTime(endDateTime));
    }

    // 转换成旧的 Date 类
    public static Date toDate(LocalDateTime dateTime) {
        ZoneId zone = ZoneId.systemDefault();
        ZonedDateTime zdt = dateTime.atZone(zone);
        return Date.from(zdt.toInstant());
    }

    public static Date toDate(LocalDate date) {
        return Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

    // 将 Date 转 LocalDateTime
    public static LocalDateTime toLocalDateTime(Date date) {
        Instant instant = date.toInstant();
        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    }

    // 将 Date 转 LocalDate
    public static LocalDate toLocalDate(Date date) {
        return toLocalDateTime(date).toLocalDate();
    }

    // 将字符串或 Date 转 LocalDateTime
    public static LocalDateTime toLocalDateTime(String dateTimeStr) {
        return parseDateTime(dateTimeStr);
    }

    public static LocalDateTime toLocalDateTime(Object dateOrString) {
        if (dateOrString instanceof Date) {
            return toLocalDateTime((Date) dateOrString);
        } else if (dateOrString instanceof String) {
            return parseDateTime((String) dateOrString);
        } else {
            throw new IllegalArgumentException("Unsupported type. Must be Date or String.");
        }
    }

    // 获取当前时间戳
    public static long getCurrentTimestamp() {
        return Instant.now().getEpochSecond();
    }

    // 时间戳转换为 LocalDateTime
    public static LocalDateTime timestampToLocalDateTime(long timestamp) {
        return LocalDateTime.ofEpochSecond(timestamp, 0, ZoneOffset.UTC);
    }

    // LocalDateTime 转时间戳
    public static long toTimestamp(LocalDateTime dateTime) {
        return dateTime.toEpochSecond(ZoneOffset.UTC);
    }
}

用用看

public class TestDateUtils {
    public static void main(String[] args) {
        // 获取当前时间
        LocalDateTime now = DateUtils.getCurrentDateTime();
        System.out.println("当前时间: " + DateUtils.formatDateTime(now));

        // 字符串解析为日期时间
        LocalDateTime dateTimeFromString = DateUtils.toLocalDateTime("2024-10-09 12:30:45");
        System.out.println("解析的日期时间: " + dateTimeFromString);

        // Date 转 LocalDateTime
        Date nowDate = new Date();
        LocalDateTime dateTimeFromDate = DateUtils.toLocalDateTime(nowDate);
        System.out.println("Date 转换为 LocalDateTime: " + dateTimeFromDate);

        // 日期加减操作
        LocalDateTime tomorrow = DateUtils.addDays(nowDate, 1);
        System.out.println("明天的此刻: " + DateUtils.formatDateTime(tomorrow));

        // 时间戳操作
        long currentTimestamp = DateUtils.getCurrentTimestamp();
        System.out.println("当前时间戳: " + currentTimestamp);

        LocalDateTime fromTimestamp = DateUtils.timestampToLocalDateTime(currentTimestamp);
        System.out.println("时间戳转换为日期时间: " + DateUtils.formatDateTime(fromTimestamp));
    }
}

通过这种改造,DateUtils 现在可以处理更多类型的时间输入,提高了工具类的灵活性和兼容性。善用 DateUtils,不只是优化代码,更是让我们对生活与工作的每一秒都心中有数。时间不再难以驾驭, DateUtils 让这一切变得有章可循。技术的发展让我们得以创造,而时间管理的优化,则让我们在纷繁复杂的世界里,掌控自己的节奏。

时间一个啥东西,抓不住,留不住,但是我们可以记住。
时间一个啥东西,抓不住,留不住,但是它见证了我们的成长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值