All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.util.time.TimeUtil Maven / Gradle / Ivy

The newest version!
package io.github.util.time;

import io.github.constant.TimeConstant;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.List;

public class TimeUtil {

    /**
     * 获取今天的时间
     * @return String 日期时间字符串,例如 2023-08-11 09:51:53
     */
    public static String today(){
        return nowDateTimeFormat();
    }

    /**
     * 获取明天的时间
     * @return String 日期时间字符串, 例如 2023-08-12 09:51:53
     */
    public static String tomorrow(){
        return  timeFormat(plus(LocalDateTime.now(),1,ChronoUnit.DAYS),TimeConstant.YMD_HMS);
    }

    /**
     * 获取昨天的时间
     * @return String 日期时间字符串, 例如 2023-08-10 09:51:53
     */
    public static String yesterday(){
        return  timeFormat(minus(LocalDateTime.now(),1,ChronoUnit.DAYS),TimeConstant.YMD_HMS);
    }

    /**
     * 获取当前日期和时间字符串.
     *
     * @return String 日期时间字符串,例如 2015-08-11 09:51:53
     */
    public static String nowDateTimeFormat() {
        return timeFormat(LocalDateTime.now(), TimeConstant.YMD_HMS);
    }


    /**
     * 获取当前日期和时间字符串.
     *
     * @return String 日期时间字符串,例如 2015-08-11 09:51:53
     */
    public static String nowDateFormat() {
        return timeFormat(LocalDate.now(), TimeConstant.YMD);
    }

    /**
     * 获取当前时间字符串.
     *
     * @return String 时间字符串,例如 09:51:53
     */
    public static String nowTimeFormat() {
        return timeFormat(LocalTime.now(), TimeConstant.HMS);
    }

    /**
     * 获取当前星期字符串.
     *
     * @return String 当前星期字符串,例如 星期二
     */
    public static String nowWeekDayFormat() {return timeFormat(LocalDate.now(), "E"); }

    /**
     * 获取日期时间字符串
     *
     * @param temporal 需要转化的日期时间
     * @param pattern  时间格式
     * @return String 日期时间字符串,例如 2015-08-11 09:51:53
     */
    public static String timeFormat(TemporalAccessor temporal, String pattern) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
        return dateTimeFormatter.format(temporal);
    }


    /**
     * 日期时间字符串转换为日期时间(java.time.LocalDateTime)
     * 默认 yyyy-mm-dd hh:mm:ss
     * @param dateTimeStr 日期时间字符串
     * @return LocalDateTime 日期时间
     */
    public static LocalDateTime parseDateTime(String dateTimeStr) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(TimeConstant.YMD_HMS);
        return LocalDateTime.parse(dateTimeStr, dateTimeFormatter);
    }

    /**
     * 日期字符串转换为日期(java.time.LocalDate)
     * 默认 yyyy-mm-dd
     * @param dateStr 日期字符串
     * @return LocalDate 日期
     */
    public static LocalDate parseDate(String dateStr) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(TimeConstant.YMD);
        return LocalDate.parse(dateStr, dateTimeFormatter);
    }

    /**
     * 日期时间字符串转换为日期时间(java.time.LocalDateTime)
     *
     * @param dateTimeStr 日期时间字符串
     * @param pattern          日期时间格式 例如DATETIME_PATTERN
     * @return LocalDateTime 日期时间
     */
    public static LocalDateTime parseDateTime(String dateTimeStr, String pattern) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
        return LocalDateTime.parse(dateTimeStr, dateTimeFormatter);
    }

    /**
     * 日期字符串转换为日期(java.time.LocalDate)
     *
     * @param dateStr 日期字符串
     * @param pattern      日期格式 例如DATE_PATTERN
     * @return LocalDate 日期
     */
    public static LocalDate parseDate(String dateStr, String pattern) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
        return LocalDate.parse(dateStr, dateTimeFormatter);
    }


    /**
     * 获取指定日期时间加上指定数量日期时间单位之后的日期时间.
     *
     * @param localDateTime 日期时间
     * @param num           数量
     * @param chronoUnit    日期时间单位
     * @return LocalDateTime 新的日期时间
     */
    public static LocalDateTime plus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) {
        return localDateTime.plus(num, chronoUnit);
    }

    /**
     * 获取指定日期时间减去指定数量日期时间单位之后的日期时间.
     *
     * @param localDateTime 日期时间
     * @param num           数量
     * @param chronoUnit    日期时间单位
     * @return LocalDateTime 新的日期时间
     */
    public static LocalDateTime minus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) {
        return localDateTime.minus(num, chronoUnit);
    }

    /**
     * 根据ChronoUnit计算两个日期时间之间相隔日期时间
     *
     * @param start      开始日期时间
     * @param end        结束日期时间
     * @param chronoUnit 日期时间单位
     * @return long 相隔日期时间
     */
    public static long between(LocalDateTime start, LocalDateTime end, ChronoUnit chronoUnit) {
        return Math.abs(start.until(end, chronoUnit));
    }

    /**
     * 根据ChronoUnit计算两个日期之间相隔年数或月数或天数
     *
     * @param start      开始日期
     * @param end        结束日期
     * @param chronoUnit 日期时间单位,(ChronoUnit.YEARS,ChronoUnit.MONTHS,ChronoUnit.WEEKS,ChronoUnit.DAYS)
     * @return long 相隔年数或月数或天数
     */
    public static long between(LocalDate start, LocalDate end, ChronoUnit chronoUnit) {
        return Math.abs(start.until(end, chronoUnit));
    }

    /**
     * 获取指定日期开始时间的日期字符串
     *
     * @param localDateTime 指定日期时间
     * @return String 格式:yyyy-MM-dd 00:00:00
     */
    public static String startOfDay(LocalDateTime localDateTime) {
        return startOfDay(localDateTime, TimeConstant.YMD_HMS);
    }

    /**
     * 获取指定日期结束时间的日期字符串
     *
     * @param localDateTime 指定日期时间
     * @return String 格式:yyyy-MM-dd 23:59:59
     */
    public static String endOfDay(LocalDateTime localDateTime) {
        return endOfDay(localDateTime, TimeConstant.YMD_HMS);
    }

    /**
     * 获取指定日期开始时间的日期字符串,带日期格式化参数
     *
     * @param localDateTime 指定日期时间
     * @param pattern       日期时间格式
     * @return String 格式:yyyy-MM-dd HH:mm:ss
     */
    public static String startOfDay(LocalDateTime localDateTime, String pattern) {
        return timeFormat(localDateTime.withHour(0).withMinute(0).withSecond(0), pattern);
    }

    /**
     * 获取指定日期结束时间的日期字符串,带日期格式化参数
     *
     * @param localDateTime 指定日期时间
     * @param pattern       日期时间格式
     * @return String 格式:yyyy-MM-dd 23:59:59
     */
    public static String endOfDay(LocalDateTime localDateTime, String pattern) {
        return timeFormat(localDateTime.withHour(23).withMinute(59).withSecond(59), pattern);
    }

    /**
     * 切割日期。按照周期切割成小段日期段。例如: 
* * @param startDate 开始日期(yyyy-MM-dd) * @param endDate 结束日期(yyyy-MM-dd) * @param period 周期(天,周,月,年) * @return 切割之后的日期集合 * input startDate="2019-02-28",endDate="2019-03-05",period="day" * output [2019-02-28, 2019-03-01, 2019-03-02, 2019-03-03, 2019-03-04, 2019-03-05] */ public static List splitDateToList(String startDate, String endDate, String period) { List result = new ArrayList<>(); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(TimeConstant.YMD); LocalDate end = LocalDate.parse(endDate, dateTimeFormatter); LocalDate start = LocalDate.parse(startDate, dateTimeFormatter); LocalDate tmp = start; switch (period) { case "day": while (start.isBefore(end) || start.isEqual(end)) { result.add(start.toString()); start = start.plusDays(1); } break; case "week": while (tmp.isBefore(end) || tmp.isEqual(end)) { if (tmp.plusDays(6).isAfter(end)) { result.add(tmp.toString() + "," + end); } else { result.add(tmp.toString() + "," + tmp.plusDays(6)); } tmp = tmp.plusDays(7); } break; case "month": while (tmp.isBefore(end) || tmp.isEqual(end)) { LocalDate lastDayOfMonth = tmp.with(TemporalAdjusters.lastDayOfMonth()); if (lastDayOfMonth.isAfter(end)) { result.add(tmp.toString() + "," + end); } else { result.add(tmp.toString() + "," + lastDayOfMonth); } tmp = lastDayOfMonth.plusDays(1); } break; case "year": while (tmp.isBefore(end) || tmp.isEqual(end)) { LocalDate lastDayOfYear = tmp.with(TemporalAdjusters.lastDayOfYear()); if (lastDayOfYear.isAfter(end)) { result.add(tmp.toString() + "," + end); } else { result.add(tmp.toString() + "," + lastDayOfYear); } tmp = lastDayOfYear.plusDays(1); } break; default: break; } return result; } /** * 生成多少时间之前的文本 例如: 1 minute ago * @param dateTime 传递的时间 * @return 1 minute ago */ public static String timeAgo(LocalDateTime dateTime) { LocalDateTime now = LocalDateTime.now(); Duration duration = Duration.between(dateTime, now); long days = duration.toDays(); long hours = duration.toHours(); long minutes = duration.toMinutes(); if (minutes < 1) { return "now"; } else if (minutes < 60) { return minutes + " minute" + (minutes > 1 ? "s" : "") + " ago"; } else if (hours < 24) { return hours + " hour" + (hours > 1 ? "s" : "") + " ago"; } else if (days < 30){ return days + " day" + (days > 1 ? "s" : "") + " ago"; } else if(days < 365){ long months = days/30; return months + " month" + (months > 1 ? "s" : "") + " ago"; }else{ long years = days/365; return years + " year" + (years > 1 ? "s" : "") + " ago"; } } /** * LocalDateTime 转 毫秒 * @param dateTime * @return long 毫秒 */ public static long DateTimeToLong(LocalDateTime dateTime) { return dateTime.toInstant(ZoneOffset.UTC).toEpochMilli(); } /** * LocalDateTimeStr 转 毫秒 * 格式: yyyy-mm-dd hh:mm:ss * @param dateTimeStr * @return long 毫秒 */ public static long DateTimeToLong(String dateTimeStr) { LocalDateTime dateTime = parseDateTime(dateTimeStr); return dateTime.toInstant(ZoneOffset.UTC).toEpochMilli(); } public static void main(String[] args) { System.out.println(today()); System.out.println(tomorrow()); System.out.println(yesterday()); System.out.println(startOfDay(parseDateTime(yesterday()))); System.out.println(endOfDay(parseDateTime(yesterday()))); System.out.println(DateTimeToLong("2023-11-11 12:34:56")); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy