四时宝库

程序员的知识宝库

Java8日期时间类使用详解,干货满满,不容错过哦

1 获取当前时间

// 代码
@Test
public void now(){
  LocalDate localDate = LocalDate.now();
  log.info("日期:"+ localDate);
  LocalTime localTime = LocalTime.now();
  log.info("时间:"+ localTime);
  LocalDateTime localDateTime = LocalDateTime.now();
  log.info("日期时间:"+ localDateTime);
}
// 输出
INFO - 日期:2023-09-05
INFO - 时间:22:28:21.994
INFO - 日期时间:2023-09-05T22:28:21.994

分享jdk1.8特性LocalDateTime操作日期工具类

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;

/**
 * @author javawency
 * @description: 时间工具类
 **/
public class Date2Utils {

    /**
     * 时间对象转字符串
     *
     * @param date
     * @return
     * @throws ParseException
     */
    public static String dateToStr(Date date) {
        SimpleDateFormat format = new SimpleDateFormat(DatePattern.NORM_DATETIME_PATTERN);
        return format.format(date);
    }

    /**
     * 时间对象转字符串
     *
     * @param date
     * @param pattern
     * @return
     * @throws ParseException
     */
    public static String dateToStr(Date date, String pattern) {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        return format.format(date);
    }

    /**
     * 字符串转时间对象
     *
     * @param dateStr
     * @return
     * @throws ParseException
     */
    public static Date strToDate(String dateStr) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat(DatePattern.NORM_DATETIME_PATTERN);
        Date date = format.parse(dateStr);
        return date;
    }

    /**
     * 字符串转时间对象
     *
     * @param dateStr
     * @param pattern
     * @return
     * @throws ParseException
     */
    public static Date strToDate(String dateStr, String pattern) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        Date date = format.parse(dateStr);
        return date;
    }

    /**
     * 获取两个日期相差的天数
     *
     * @param date    开始时间
     * @param endDate 结束时间
     * @return 返回相差天数
     * @throws ParseException
     */
    public static long getBetweenDay(Date date, Date endDate) throws ParseException {
        SimpleDateFormat dfs = new SimpleDateFormat(DatePattern.NORM_DATE_PATTERN);
        String dateStr = dfs.format(date);
        String endDateStr = dfs.format(endDate);
        Date parseDate = dfs.parse(dateStr);
        Date parseEndDate = dfs.parse(endDateStr);
        long day = DateUtil.between(parseDate, parseEndDate, DateUnit.DAY);
        return day;
    }


    /**
     * 今天的开始时间
     *
     * @return yyyy-MM-dd 00:00:00
     */
    public static String dayStart() {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
        LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
        String dayStartStr = todayStart.format(dateTimeFormatter);
        return dayStartStr;
    }

    /**
     * 今天的结束时间
     *
     * @return yyyy-MM-dd 23:59:59
     */
    public static String dayEnd() {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
        LocalDateTime dayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
        String dayEndStr = dayEnd.format(dateTimeFormatter);
        return dayEndStr;
    }

    /**
     * 本周开始时间
     *
     * @return yyyy-MM-dd 00:00:00
     */
    public static String weekStart() {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
        LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
        TemporalAdjuster firstWeek = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.minusDays(localDate.getDayOfWeek().getValue() - DayOfWeek.MONDAY.getValue()));
        String weekStart = localDateTime.with(firstWeek).format(dateTimeFormatter);
        return weekStart;
    }

    /**
     * 本周结束时间
     *
     * @return yyyy-MM-dd 23:59:59
     */
    public static String weekEnd() {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
        LocalDateTime todayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
        TemporalAdjuster lastWeek = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.plusDays(DayOfWeek.SUNDAY.getValue() - localDate.getDayOfWeek().getValue()));
        String weekEnd = todayEnd.with(lastWeek).format(dateTimeFormatter);
        return weekEnd;
    }

    /**
     * 本月开始时间
     *
     * @return yyyy-MM-dd 00:00:00
     */
    public static String monthStart() {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
        LocalDateTime localDateTime = LocalDateTime.now();
        LocalDate localDate = LocalDate.of(localDateTime.getYear(), localDateTime.getMonth(), 1);
        String monthStart = LocalDateTime.of(localDate, LocalTime.MIN).format(dateTimeFormatter);
        return monthStart;
    }

    /**
     * 本月结束时间
     *
     * @return yyyy-MM-dd 23:59:59
     */
    public static String monthEnd() {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
        LocalDateTime todayEnd = LocalDateTime.now();
        LocalDateTime with = todayEnd.with(TemporalAdjusters.lastDayOfMonth());
        LocalDateTime localDateTime = LocalDateTime.of(with.toLocalDate(), LocalTime.MAX);
        String monthEnd = localDateTime.format(dateTimeFormatter);
        return monthEnd;
    }

    /**
     * 今年开始时间
     *
     * @return yyyy-MM-dd 00:00:00
     */
    public static String yearStart() {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
        LocalDateTime localDateTime = LocalDateTime.now();
        LocalDate localDate = LocalDate.of(localDateTime.getYear(), 1, 1);
        String yearStart = LocalDateTime.of(localDate, LocalTime.MIN).format(dateTimeFormatter);
        return yearStart;
    }

    /**
     * 今年结束时间
     *
     * @return yyyy-MM-dd 23:59:59
     */
    public static String yearEnd() {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
        LocalDateTime todayEnd = LocalDateTime.now();
        LocalDateTime with = todayEnd.with(TemporalAdjusters.lastDayOfYear());
        LocalDateTime localDateTime = LocalDateTime.of(with.toLocalDate(), LocalTime.MAX);
        String yearEnd = localDateTime.format(dateTimeFormatter);
        return yearEnd;
    }

    /**
     * 重置秒
     *
     * @param date
     * @param second
     * @return
     */
    public static Date resetSecond(Date date, int second) {
        if (second < 0 || second > 59) {
            return date;
        }
        LocalDateTime localDate = dateToLocalDateTime(date);
        localDate = localDate.withSecond(second);
        Date newDate = localDateTimeToDate(localDate);
        return newDate;
    }

    /**
     * 重置秒
     *
     * @param dateStr
     * @param second
     * @return
     * @throws ParseException
     */
    public static Date resetSecond(String dateStr, int second) throws ParseException {
        if (second < 0 || second > 59) {
            return strToDate(dateStr);
        }
        Date date = strToDate(dateStr);
        LocalDateTime localDate = dateToLocalDateTime(date);
        localDate = localDate.withSecond(second);
        Date newDate = localDateTimeToDate(localDate);
        return newDate;
    }

    public static Date localDateToDate(LocalDate localDate) {
        return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
    }

    public static LocalDate dateToLocalDate(Date date) {
        Instant instant = date.toInstant();
        ZoneId zone = ZoneId.systemDefault();
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
        LocalDate localDate = localDateTime.toLocalDate();
        return localDate;
    }

    public static Date localDateTimeToDate(LocalDateTime localDateTime) {
        ZoneId zoneId = ZoneId.systemDefault();
        ZonedDateTime zdt = localDateTime.atZone(zoneId);
        Date date = Date.from(zdt.toInstant());
        return date;
    }

    public static LocalDateTime dateToLocalDateTime(Date date) {
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
        return localDateTime;
    }

    /**
     * 判断两个时间是否相等
     *
     * @param date
     * @param date2
     * @return
     */
    public static boolean equal(Date date, Date date2) {
        LocalDateTime localDateTime = dateToLocalDateTime(date);
        LocalDateTime localDateTime2 = dateToLocalDateTime(date2);
        return localDateTime.isEqual(localDateTime2);
    }

    /**
     * 判断date 日期是否小于date2
     *
     * @param date
     * @param date2
     * @return
     */
    public static boolean after(Date date, Date date2) {
        LocalDateTime localDateTime = dateToLocalDateTime(date);
        LocalDateTime localDateTime2 = dateToLocalDateTime(date2);
        return localDateTime.isAfter(localDateTime2);
    }

    /**
     * 比较日期相差多少天
     *
     * @param date
     * @param date2
     * @return
     */
    public static int differenceDays(Date date, Date date2) {
        LocalDate localDateTime = dateToLocalDate(date);
        LocalDate localDateTime2 = dateToLocalDate(date2);
        Period period = Period.between(localDateTime, localDateTime2);
        return period.getDays();
    }

    public static int differenceDays(LocalDate localDate, LocalDate localDate2) {
        Period period = Period.between(localDate, localDate2);
        return period.getDays();
    }

}

教你如何优雅地用Java8 实现日期时间的操作

作者 | Java圣斗士 | 原创文章,转载请注明出处

全文4000字,阅读大约需要15分钟,建议收藏

小花:Hey,Morty。最近正在准备面试,你说Java8 的新特性会不会考到呢?

桌面太混乱?一个小脚本让你的桌面清爽,文件按日期乖乖排列好

#程序员干货站#


因为很多时候需要把素材放到桌面上方便使用,就造成了我的桌面非常之混乱,于是写了一个小bat脚本用于整理桌面。

从LocalDateTime序列化探讨全局一致性序列化


楔子

今天要写的是这篇:从LocalDateTime序列化来看全局一致性序列化体验。

这个标题看起来蛮不像人话的,有种挺官方的感觉,我先给大家翻译翻译我们的主题是什么:通过讲解LocalDateTime的序列化从而引出整个项目中的所有序列化处理,并让他们保持一致。

还在用SimpleDateFormat?Java8都发布N年了,转LocalDateTime吧

前言

Java8发布,已有数年之久,但是发现很多人都还是坚持着用SimpleDateFormat和Date进行时间操作。SimpleDateFormat这个类不是线程安全的,在使用的时候稍不注意,就会产生致命的问题。Date这个类,是可以重新设置时间的,这对于一些类内部的属性来说,是非常不安全的。

Java 计算日期属于当月第几周(日期周计算)


计算日期属于当月第几周(日期周计算)

本文周计算时间方式为:当月第一个周一为第一周 计算

项目多时区处理(多项目时间管理)

为什么要讲一下这个问题呢?

很多时候在项目的开发中或许没有接触过多时区,项目大多是部署国内,同时仅仅为国内用户提供服务,一旦当用户到国外后,项目中的很多时间都变得与当地时间不一样,对用户非常不友好。例如近几年非常火的线上教育,像一些外籍老师,教小朋友学英文,如何保证双方在特定的时间都进入教室,变得非常常见。

LocalDateTime 说:2020,是时候换个更好的日期时间类了

作者:何甜甜

链接:https://juejin.im/post/5d7787625188252388753eae

在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗?

为什么建议使用你 LocalDateTime,而不是 Date?

Java后端,选择

优质文章,及时送达

作者 | 何甜甜在吗

来源 | juejin.im/post/5d7787625188252388753eae

在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接