Hướng Dẫn Phát Triển Utility Class Xử Lý Ngày Tháng Trong Java

Trong quá trình phát triển ứng dụng Java, việc thao tác với ngày giờ thường gặp nhiều bất tiện do sự phức tạp của các API mặc định như Date hoặc Calendar. Sử dụng thư viện Hutool giúp đơn giản hóa quy trình này thông qua một bộ công cụ mạnh mẽ và trực quan.

Cấu Hình Thư Viện Cần Thiết

Để tích hợp chức năng xử lý thời gian, trước hết cần khai báo gói phụ thuộc (dependency) vào file cấu trúc dự án pom.xml.

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.3.5</version>
</dependency>

Xây Dựng Lớp Hỗ Trợ Thời Gian

Sau khi thiết lập môi trường, chúng ta tiến hành tạo một lớp tiện ích (utility class) kế thừa từ DateUtil của Hutool để mở rộng thêm các phương thức tùy chỉnh cho dự án.

package com.example.core.util;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;

import java.util.Date;

/**
 * Lớp tiện ích quản lý hoạt động liên quan đến thời gian
 */
public class DateTimeSupport extends DateUtil {

    // Các chuỗi mẫu (Pattern) định dạng ngày giờ phổ biến
    private static final String PATTERN_YEAR = "yyyy";
    private static final String PATTERN_MONTH_YEAR = "yyyy-MM";
    private static final String PATTERN_FULL_DATE = "yyyy-MM-dd";
    private static final String PATTERN_DATETIME = "yyyy-MM-dd HH:mm:ss";
    private static final String PATTERN_TIME_ONLY = "HH:mm:ss";
    private static final String PATTERN_DAY_TIME = "MM-dd HH:mm:ss";

    /**
     * Lấy năm hiện tại dưới dạng chuỗi
     */
    public static String fetchCurrentYear() {
        return DateUtil.formatNow(PATTERN_YEAR);
    }

    /**
     * Lấy năm và tháng hiện tại
     */
    public static String getCurrentYearMonth() {
        return DateUtil.formatNow(PATTERN_MONTH_YEAR);
    }

    /**
     * Lấy ngày đầy đủ hiện tại theo định dạng yyyy-MM-dd
     */
    public static String getTodayStr() {
        return DateUtil.formatDate(new Date());
    }

    /**
     * Lấy thời gian chi tiết bao gồm cả giờ phút giây
     */
    public static String getCompleteTimestamp() {
        return DateUtil.formatDateTime(new Date());
    }

    /**
     * Chuyển đổi đối tượng Date sang chuỗi theo pattern tùy chọn
     * @param targetDate Ngày cần chuyển đổi
     * @param format Mẫu chuỗi mong muốn
     */
    public static String formatDateToStr(Date targetDate, String format) {
        if (targetDate == null) {
            return CharSequenceUtil.EMPTY;
        }
        return DateUtil.format(targetDate, format);
    }

    /**
     * Phân tích chuỗi thành đối tượng Date dựa trên format
     */
    public static Date parseStringToDate(String dateString, String format) {
        return DateUtil.parse(dateString, format);
    }

    /**
     * Tính toán thời gian sau N ngày kể từ điểm mốc
     */
    public static String calculateFutureDate(Date referenceDate, int daysToAdd) {
        Date resultDate = DateUtil.offsetDay(referenceDate, daysToAdd);
        return DateUtil.format(resultDate, PATTERN_DATETIME);
    }

    /**
     * Tính toán thời gian trước N ngày
     */
    public static String calculatePastDate(Date referenceDate, int daysToSubtract) {
        Date resultDate = DateUtil.offsetDay(referenceDate, -daysToSubtract);
        return DateUtil.format(resultDate, PATTERN_DATETIME);
    }

    /**
     * Thêm hoặc trừ số giờ vào thời điểm gốc
     */
    public static String adjustHours(Date baseTime, int hourOffset) {
        Date adjustedTime = DateUtil.offsetHour(baseTime, hourOffset);
        return DateUtil.format(adjustedTime, PATTERN_DATETIME);
    }

    /**
     * Đo khoảng cách giữa hai chuỗi thời gian theo đơn vị giây
     */
    public static long countSecondsDiff(String startStr, String endStr) {
        Date startDate = DateUtil.parse(startStr);
        Date endDate = DateUtil.parse(endStr);
        return DateUtil.between(startDate, endDate, DateUnit.SECOND);
    }

    /**
     * Kiểm tra xem một thời điểm có nằm trong khoảng thời gian cho phép không
     */
    public static boolean isWithinRange(String checkTime, String rangeStart, String rangeEnd) {
        Date judge = DateUtil.parse(checkTime);
        Date min = DateUtil.parse(rangeStart);
        Date max = DateUtil.parse(rangeEnd);
        return DateUtil.isIn(judge, min, max);
    }

    /**
     * So sánh độ lớn của hai giá trị thời gian
     * @return true nếu time1 muộn hơn time2
     */
    public static boolean isLaterThan(String time1, String time2, String format) {
        Date d1 = parseStringToDate(time1, format);
        Date d2 = parseStringToDate(time2, format);
        return d1.after(d2);
    }

    /**
     * Đánh giá thời gian trễ so với giới hạn tối đa cho phép (timeout)
     */
    public static String assessTimeout(long limitMs, long startTimeMs, long endTimeMs) {
        long duration = endTimeMs - startTimeMs;
        String statusMessage = (duration > limitMs) ? "vi phạm giới hạn" : "trong phạm vi";
        return duration + "ms, trạng thái: " + statusMessage;
    }
}

Hồ Sơ Các Chức Năng Cốt Lõi

Lớp tiện ích trên cung cấp khả năng định dạng, phân tích, cộng trừ ngày giờ và so sánh thời gian. Việc sử dụng các hằng số pattern giúp chuẩn hóa đầu ra của hệ thống. Phương thức assessTimeout đặc biệt hữu ích khi cần giám sát hiệu suất hoặc thời gian xử lý của các dịch vụ backend.

Thẻ: Java hutool date-util utility-class software-development

Đăng vào ngày 22 tháng 5 lúc 03:29