日期格式转换工具类(线程安全)

2023-11-08

import java.text.ParseException;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 日期操作的工具类,
 * 使用java8日期API编写
 */
public class DateUtil {

    private static Map<String, DateTimeFormatter> FORMATTER_CACHE = new ConcurrentHashMap<>();

    /**
     * 24小时制小时占位符
     */
    private static String HOURS = "H";

    /**
     * 12小时制小时占位符
     */
    private static String HOURS_12 = "h";

    /**
     * 分钟站位符
     */
    private static String MINUTES = "m";

    /**
     * 秒占位符
     */
    private static String SECONDS = "s";

    /**
     * 获取本周的第一天
     *
     * @return
     */
    public static Date getFirstDayOfCurrentWeek() {

        return getFirstDayOfWeek(LocalDate.now());
    }

    public static Date getFirstDayOfWeek(LocalDate localDate) {
        LocalDate date = localDate;
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        if (dayOfWeek.equals(DayOfWeek.MONDAY)) {
            return toDate(date);
        }
        date = date.minus(dayOfWeek.minus(1).getValue(), ChronoUnit.DAYS);
        return toDate(date);
    }

    public static Date getFirstDayOfWeek(Date date) {
        return getFirstDayOfWeek(toLocalDate(date));
    }

    /**
     * 获取当月的第一天
     *
     * @return
     */
    public static Date getFirstDayOfCurrentMonth() {
        return getFirstDayOfMonth(LocalDate.now());
    }

    public static Date getFirstDayOfMonth(LocalDate localDate) {
        LocalDate date = localDate;
        int dayOfMonth = date.getDayOfMonth();
        date = date.minus(dayOfMonth - 1, ChronoUnit.DAYS);
        return toDate(date);
    }

    public static Date getFirstDayOfMonth(Date date) {
        return getFirstDayOfMonth(toLocalDate(date));
    }

    /**
     * 获取当年的第一天
     *
     * @return
     */
    public static Date getFirstDayOfCurrentYear() {
        return getFirstDayOfYear(LocalDate.now());
    }

    public static Date getFirstDayOfYear(LocalDate localDate) {
        LocalDate date = localDate;
        int dayOfYear = date.getDayOfYear();
        date = date.minus(dayOfYear - 1, ChronoUnit.DAYS);
        return toDate(date);
    }

    public static Date getFirstDayOfYear(Date date) {
        return getFirstDayOfYear(toLocalDate(date));
    }

    /**
     * 日期字符串解析
     *
     * @param source  字符串源
     * @param pattern 格式
     * @return
     */
    public static Date parse(String source, String pattern) {
        DateTimeFormatter formatter = getFormatter(pattern);
        if (pattern.contains(HOURS) || pattern.contains(HOURS_12) || pattern.contains(MINUTES)
                || pattern.contains(SECONDS)) {
            return toDate(LocalDateTime.parse(source, formatter));
        } else {
            return toDate(LocalDate.parse(source, formatter));
        }
    }

    /**
     * 格式化日期
     *
     * @return
     */
    public static String format(Date date, String pattern) {
        DateTimeFormatter formatter = getFormatter(pattern);
        return formatter.format(toLocalDateTime(date));
    }

    /**
     * 偏移指定时间段的时间,不改变原来的时间,返回新的时间对象
     *
     * @param date
     * @param duration
     * @param chronoUnit
     * @return
     */
    public static Date offSet(Date date, long duration, ChronoUnit chronoUnit) {
        LocalDateTime localDateTime = toLocalDateTime(date);
        return toDate(localDateTime.plus(duration, chronoUnit));
    }

    /**
     * 获得两个日期之间的时间间隔
     *
     * @param start
     * @param end
     * @param chronoUnit
     * @return 返回以chronoUnit为时间单位的数值
     */
    public static long between(Date start, Date end, ChronoUnit chronoUnit) {
        return chronoUnit.between(toLocalDateTime(start), toLocalDateTime(end));
    }

    /**
     * 获取系统所在时区
     *
     * @return
     */
    private static ZoneId getSystemDefaultZoneId() {
        return ZoneOffset.systemDefault();
    }

    private static Date toDate(Instant instant) {
        return Date.from(instant);
    }

    private static Date toDate(LocalDateTime localDateTime) {
        return toDate(localDateTime.atZone(getSystemDefaultZoneId()).toInstant());
    }

    private static Date toDate(LocalDate localDate) {
        return toDate(localDate.atStartOfDay(getSystemDefaultZoneId()).toInstant());
    }

    private static LocalDateTime toLocalDateTime(Date date) {
        return LocalDateTime.ofInstant(date.toInstant(), getSystemDefaultZoneId());
    }

    public static LocalDate toLocalDate(Date date) {
        return LocalDate.from(toLocalDateTime(date));
    }

    private static DateTimeFormatter getFormatter(String pattern) {
        DateTimeFormatter formatter = FORMATTER_CACHE.get(pattern);
        if (formatter == null) {
            formatter = DateTimeFormatter.ofPattern(pattern);
            FORMATTER_CACHE.put(pattern, formatter);
        }
        return formatter;
    }

    public static long getCurrentTimeMillis() {
        return System.currentTimeMillis();
    }

    public static Date ofTime(long timeMillis) {
        return new Date(timeMillis);
    }

    public static void main(String[] args) {
        Date parse = parse("20190101", "yyyyMMdd");
        System.out.println(parse);

        //Date parse = parse("20190101", "yyyyMMdd"); //报错
//        Date parse = parse("2019-01-01 01:01:01", "yyyy-MM-dd HH:mm:ss");

//        System.out.println(parse);
//        Date date = new Date();
//        Date d1 = offSet(date, 1, ChronoUnit.HOURS);
//        Date d2 = offSet(date, 1, ChronoUnit.DAYS);
//        Date d3 = offSet(date, 1, ChronoUnit.MINUTES);
//        Date d4 = offSet(date, -1, ChronoUnit.MINUTES);
//        System.out.println(date);
//        System.out.println(d1);
//        System.out.println(d2);
//        System.out.println(d3);
//        System.out.println(d4);
//
//        System.out.println(format(new Date(), "yyyy-MM-dd HH:mm:ss"));
//
//        System.out.println(toDate(LocalDate.now()));
        LocalDate now = LocalDate.now();
        System.out.println(getFirstDayOfWeek(now));
        System.out.println(now);
        System.out.println(getFirstDayOfNextWeek());
        System.out.println(getFirstDayOfNextMonth());
        System.out.println(getFirstDayOfNextYear());
        String format = format(new Date(), "yyyyMM hh");
        System.out.println(format);

        System.out.println(parseMillis(11111111111111111L));
    }

    /**
     * 获取下周的第一天的日期
     */
    public static Date getFirstDayOfNextWeek() {
        return getFirstDayOfNextWeek(LocalDate.now());
    }

    public static Date getFirstDayOfNextWeek(LocalDate localDate) {
        LocalDate date = localDate;
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        if (dayOfWeek.equals(DayOfWeek.MONDAY)) {
            return toDate(date);
        }
        date = date.minus(dayOfWeek.minus(1).getValue(), ChronoUnit.DAYS);
        date = date.plusWeeks(1);
        return toDate(date);
    }

    /**
     * 获取下一个月的第一天的日期
     */
    public static Date getFirstDayOfNextMonth() {
        return getFirstDayOfNextMonth(LocalDate.now());
    }

    public static Date getFirstDayOfNextMonth(LocalDate localDate) {
        LocalDate date = localDate;
        int dayOfMonth = date.getDayOfMonth();
        date = date.minus(dayOfMonth - 1, ChronoUnit.DAYS);
        date = date.plusMonths(1);
        return toDate(date);
    }


    /**
     * 获取下一年的第一天的日期
     */
    public static Date getFirstDayOfNextYear() {
        return getFirstDayOfNextYear(LocalDate.now());
    }

    public static Date getFirstDayOfNextYear(LocalDate localDate) {
        LocalDate date = localDate;
        int dayOfYear = date.getDayOfYear();
        date = date.minus(dayOfYear - 1, ChronoUnit.DAYS);
        date = date.plusYears(1);
        return toDate(date);
    }

    /**
     * 获取当前日期
     */
    public static Date getNowDate() {
        return toDate(LocalDate.now());
    }

    /**
     * 获取当前时间
     */
    public static Date getNowDateTime() {
        return toDate(LocalDateTime.now());
    }

    /**
     * @param src
     * @return String:yyyy-MM-dd
     */
    public static String formatDate(Date src) {
        return format(src, "yyyy-MM-dd");
    }

    /**
     * @param src
     * @return String:yyyy-MM-dd HH:mm:ss
     */
    public static String formatDatetime(Date src) {
        return format(src, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * @param src
     * @return Date:yyyy-MM-dd
     */
    public static Date parseDate(String src) {
        return parse(src, "yyyy-MM-dd");
    }

    /**
     * @param src
     * @return Date:yyyy-MM-dd HH:mm:ss
     */
    public static Date parseDatetime(String src) {
        return parse(src, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 将毫秒转化(转换成*天*小时*分钟*秒)
     *
     * @param millis
     * @return
     * @throws ParseException
     */
    public static String parseMillis(long millis) {
        Duration duration = Duration.ofMillis(millis);
        long days = duration.toDays();
        duration = duration.minusDays(days);
        long hours = duration.toHours();
        duration = duration.minusHours(hours);
        long minutes = duration.toMinutes();
        duration = duration.minusMinutes(minutes);
        long secs = duration.toMillis() / 1000;
        StringBuilder sb = new StringBuilder();
        if (days > 0) {
            sb.append(days).append("天");
        }
        if (hours > 0) {
            sb.append(hours).append("小时");
        }
        if (minutes > 0) {
            sb.append(minutes).append("分钟");
        }
        if (secs > 0) {
            sb.append(secs).append("秒");
        }
        return sb.toString();
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

日期格式转换工具类(线程安全) 的相关文章

  • linux设置定时任务(crontab)操作步骤

    1 登录服务器 2 输入密码 登录成功 3 查看定时器任务 crontab l 4 编辑定时器任务 crontab e 5 保存定时器任务 1 按住sec退出 2 按住shift 再按 wq 保存并退出 备注 按住shift 再按 q 强制
  • java Map转实体工具类

    项目中使用 map转实体类 param map param entity param
  • C++ win平台路径管理类

    ifndef PATH MANAGER H define PATH MANAGER H include
  • Java判断一个时间是否在时间区间内

    package com liying tiger test import java text ParseException import java text SimpleDateFormat import java util Calenda
  • springBoot整合kafka配置

    pom xml
  • vim编辑器格式化代码

    他丫儿的搞啥子嘛 乱七八糟的 在vim中其实也有像Eclipse中的ctrl shift F 的自动格式化代码的操作 尽管非常强大 但是通常会破坏代码的原有的缩进 所以不建议在python这样缩进代替括号的语言中和源程序已经缩进过的代码中使
  • 工具类用于ajax使用json请求时返回一个json

    package com noe utils import java util HashMap 工具类 封装响应内容 会被转成json响应 MyStatus ok gt new MyStatus 0 gt code 0 new MyStatu
  • 分布式ID生成器(雪花算法改进版)ID不重复

    snowflake是Twitter开源的分布式ID生成算法 结果是一个long型的ID 其核心思想是 使用41bit作为毫秒数 10bit作为机器的ID 5个bit是数据中心 5个bit的机器ID 12bit作为毫秒内的流水号 意味着每个节
  • 打造利器Qt Creator:代码todo工具的使用

    打造利器Qt Creator 代码todo工具的使用 前言 俗话说 工欲善其事必先利其器 工作生活中 能有一款出色易用 高效简便的工具 对提高效率 达成价值有着莫大的影响 Qt是一套C 库 封装了许多好用的模块和功能 且带有先进的GUI设计
  • StrSubstitutor和StrUtil占位符字符串替换

    目录 一 commons lang包下的StrSubstitutor 1 使用场景一 2 使用场景二 二 hutoo包下的StrUtil 1 使用场景一 2 使用场景二 3 使用场景三 三 原生的三种方式 一 commons lang包下的
  • BigDecimal除法运算报错 Non-terminating decimal expansion; no exact representable decimal result.

    本文相关文章 BigDecimal类型比较大小 BigDecilmal类型加减乘除及四舍五入方法 原因是因为做除法运算的时候 得到的结果为无限循环小数 像下面的代码 我打算将1除以3 再乘100的结果 保留两位小数 但是 1除以3得到的结果
  • Git恢复本地误删文件

    转 https www cnblogs com yangshifu p 9680993 html Step 1 git status Step 2 git reset HEAD 被删除的文件或文件夹 Step 3 git checkout
  • # 后端开发技巧、常用规范

    后端开发技巧 常用规范 文章目录 后端开发技巧 常用规范 开发技巧 equals 方法的使用 创建 HashMap 指定初始化大小 Optional ofNullable orElse 避免空指针 Stream 求和 List 切割工具 单
  • 序列化工具

    import java io ByteArrayInputStream import java io ByteArrayOutputStream import java io Closeable import java io ObjectI
  • gitLens插件简单使用(默认上传github)

    1 安装 在vscode中的插件管理输入如下后下载 GitLens Git supercharged 2 配置 点击文件 首选项 设置 点击右上角设置小图标 3 github使用 首先仓库文件一定是要git init是git所管理的 1 在
  • Java写入txt文件内容

    Java写入数据进txt文件 需求 多条数据追加进文件 且需要处理中文编码问题 以下代码只能处理向文件添加数据的功能 但是会覆盖掉之前的数据 import java io File import java io FileOutputStre
  • MD5学习总结

    1 MD5简介 MD5 即消息摘要算法第五版 是一种被广泛使用的密码散列函数 散列算法的基本原理是 进行数据 如一段文字 运算 将原始数据变为另一段固定长度的值 MD5 可以产生出一个 128位 16字节 的散列值 hash value 用
  • Java开发工具Idea Revert操作

    Revert是撤销操作 类似于Ctrl Z 不同的是 Revert是以版本为单位 撤销整个版本 可以这样理解Revert操作 假如有V1 V2 V3 V4 V5五个版本 Revert撤销V3版本 实际上就是合并V2版本和V5版本 并对V2版
  • 将XML格式文件转换JSON文件格式

    XMl文件转JSON字符串 1 1Maven引入依赖
  • 简单的文件内容繁简体甄别

    在做国际化的时候 很多旧文件中的简体或者繁体 需要优化 一个一个找很麻烦 于是在查阅资料后 自己编写了一个简单的工具 废话不多说 上码子 插件 mui ui vue js jquery 項目是 hbuildx 直接創建的 change la

随机推荐