基于Java8Date-Time API的日期工具类

本文详细介绍了Java 8中改进的日期时间API,包括LocalDateTime, LocalDate, LocalTime, Instant等类的使用方法,以及如何进行日期计算、格式化和时间戳转换。此外,还展示了如何处理时区和获取特定日期,如本月第一天和最后一天。通过实例代码演示了日期之间的差距计算,为开发者提供了清晰的参考。

在旧版的 Java 中,日期时间 API 存在诸多问题,其中有:

非线程安全 − java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。

设计很差 − Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。

时区处理麻烦 − 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。

Java 8 在 java.time 包下提供了很多新的 API。以下为两个比较重要的 API:

Local(本地) − 简化了日期时间的处理,没有时区的问题。

Zoned(时区) − 通过制定的时区处理日期时间。

新的java.time包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during)与时钟(clock)的操作。

Java 8日期/时间类
Java 8的日期和时间类包含LocalDateTime、LocalDate、LocalTime、Instant、Duration以及Period,这些类都包含在java.time包中,下面我们看看这些类的用法:

package com.ruoyi.common.core.utils;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjusters;
/**
 * @ClassName TimeAPIUtils * @Description TODO
 * @Author lgn
 * @Date 18:02 2022/8/19
 * @Version 1.0
 **/
public class TimeAPIUtils {

    /**
     * 获取当前时间的时间戳(10位:不带毫秒)
     */
    public static Long getTimeStamp() {
        LocalDateTime now = LocalDateTime.now();
        return now.toEpochSecond(OffsetDateTime.now().getOffset());
    }

    /**
     * 获取当前时间的时间戳(13位:带毫秒)
     */
    public static Long getTimeStampWithMs() {
        LocalDateTime now = LocalDateTime.now();
        return now.toInstant(OffsetDateTime.now().getOffset()).toEpochMilli();
    }

    /**
     * Long --> String
     */
    public static String long2String(Long time, String pattern) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern);
        return dtf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault()));
    }

    /**
     * String --> Long
     */
    public static Long string2Long(String time, String pattern) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern);
        LocalDateTime parse = LocalDateTime.parse(time, dtf);
        return LocalDateTime.from(parse).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
    }

    /**
     * 获取本月第一天
     */
    public static LocalDate firstDayOfThisMonth() {
        LocalDate today = LocalDate.now();
        return today.with(TemporalAdjusters.firstDayOfMonth());
    }

    /**
     * 获取本月第N天
     */
    public static LocalDate dayOfThisMonth(int n) {
        LocalDate today = LocalDate.now();
        return today.withDayOfMonth(n);
    }

    /**
     * 获取本月最后一天
     */
    public static LocalDate lastDayOfThisMonth() {
        LocalDate today = LocalDate.now();
        return today.with(TemporalAdjusters.lastDayOfMonth());
    }

    /**
     * 获取指定月的最后一天
     * @param month 1-12
     */
    public static LocalDate lastDayOfMonth(int year,int month) {
        LocalDate ofDate = LocalDate.of(year, month, 1);
        return ofDate.with(TemporalAdjusters.lastDayOfMonth());
    }

    /**
     * 获取本月第一天的开始时间
     */
    public static String startOfThisMonth(String pattern) {
        LocalDateTime ofDateTime = LocalDateTime.of(firstDayOfThisMonth(), LocalTime.MIN);
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern);
        return ofDateTime.format(dtf);
    }

    /**
     * 取本月最后一天的结束时间
     */
    public static String endOfThisMonth(String pattern) {
        LocalDateTime ofDateTime = LocalDateTime.of(lastDayOfThisMonth(), LocalTime.MAX);
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern);
        return ofDateTime.format(dtf);
    }

    /**
     * 获取两个日期相差的月数
     */
    public static int getMonthDiff() {
        String text1 = "2020-08-02";
        Temporal temporal1 = LocalDate.parse(text1);
        String text2 = "2020-09-01";
        Temporal temporal2 = LocalDate.parse(text2);
        // 方法返回为相差月份
        Long l = ChronoUnit.MONTHS.between(temporal1, temporal2);
        System.out.println(l);

        return l.intValue();
    }

    /**
     *获取总的相差间隔
     */
    public static void endOfThisMonth() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate now = LocalDate.now();
        System.out.println("now:"+now);
        LocalDate startDate = LocalDate.parse("2021-05-26",formatter);

        System.out.println("相差天数:" + startDate.until(now, ChronoUnit.DAYS));
        System.out.println("相差月数:" + startDate.until(now, ChronoUnit.MONTHS));
        System.out.println("相差年数:" + startDate.until(now, ChronoUnit.YEARS));
    }

    public static void main(String[] args) {
        System.out.println(firstDayOfThisMonth());
        System.out.println(dayOfThisMonth(7));
        System.out.println(lastDayOfThisMonth());
        System.out.println(lastDayOfMonth(2020, 2));
        System.out.println(startOfThisMonth("yyyy-MM-dd HH:mm:ss"));
        System.out.println(endOfThisMonth("yyyy-MM-dd HH:mm:ss"));

        LocalDate today = LocalDate.now();
        LocalTime time = LocalTime.now();
        System.out.println(today+"-------"+time);


        System.out.println("哈哈哈:"+getMonthDiff());
    }
}


内容概要:本文档聚焦于“基于粒子群算法(PSO)的路径规划问题研究”,结合Matlab代码实现,系统阐述了PSO算法在路径规划中的应用原理与实践方法。文档不仅提供了详细的算法实现流程,还拓展介绍了智能优化算法、机器学习、信号处理、电力系统、无人机路径规划等多个前沿科研方向的技术服务内容,涵盖多种复杂优化问题的建模范例与仿真案例。特别强调在科研过程中“借力”的重要性,提倡借助成熟算法与仿真工具推动创新研究。文档附有多个网盘链接,便于读者获取完整的代码、模型及复现资料,支持对高水平论文(如博士/硕士论文、EI/SCI期刊)的算法复现与技术延伸。; 适合人群:具备一定Matlab编程基础,从事自动化、电气工程、控制科学、计算机、通信工程、机械电子等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入学习粒子群算法在路径规划中的建模与实现过程;②掌握多种智能优化算法(如GWO、PSO、DWA等)与机器学习模型在复杂工程问题中的集成应用;③复现高水平学术论文中的算法模型,提升科研创新能力与仿真实践水平。; 阅读建议:建议按照文档结构顺序系统阅读,优先关注与自身研究方向紧密相关的技术模块,结合提供的Matlab代码与Simulink仿真模型进行动手实践,充分利用网盘资源开展算法调试、模型优化与论文复现工作,以实现从理论到应用的有效转化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值