Java常用日期工具实现

2023-10-28

  1. 获取今日日期
  2. 获取本月第一天日期
  3. 获取本月最后一天日期
  4. date转日期字符串
  5. 日期字符串转date
  6. 日期字符串格式化
  7. 根据date获取past天前的日期
  8. 获取当前年周数:yyyy-w
  9. 获取范围时间内的日期集合
public class MyDateUtils {
    public static final String NORMAL_DATE_FORMAT = "yyyy-MM-dd";
    public static final String NORMAL_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";

    /**
     * 获取今日日期 yyyy-MM-dd
     */
    public static String getToday() {
        return LocalDate.now().toString();
    }

    /**
     * 获取本月第一天日期 2019-11-01
     */
    public static String getFirstDayOfMonth() {
        return LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).toString();
    }

    /**
     * 获取本月最后一天日期 2019-11-30
     */
    public static String getLastDayOfMonth() {
        return LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).toString();
    }

    /**
     * date转字符串
     */
    public static String dateToDateStr(Date date, String format) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zoneId);
        return dateTimeFormatter.format(localDateTime);
    }

    public static String dateToDateStr(Date date) {
        return dateToDateStr(date, NORMAL_DATE_FORMAT);
    }

    /**
     * 日期字符串转date
     */
    public static Date dateStrToDate(String dateStr, String format) {
        DateTimeFormatter dateDtf = DateTimeFormatter.ofPattern(format);
        LocalDateTime localDateTime = LocalDateTime.parse(dateStr, dateDtf);
        ZoneId zone = ZoneId.systemDefault();
        Instant instant = localDateTime.atStartOfDay(zone).toInstant();
        return Date.from(instant);
    }

    public static Date dateStrToDate(String dateStr) {
        return dateStrToDate(dateStr, NORMAL_DATE_FORMAT);
    }

    /**
     * 日期字符串格式化
     */
    public static String dateToStr(Long timestamp, String format) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
        Date date = new Date(timestamp);
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zoneId);
        return dateTimeFormatter.format(localDateTime);
    }

    /**
     * 根据date获取past天前的日期
     */
    public static Date getPastDate(Date date, int past) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - past);
        return calendar.getTime();
    }

    public static String getPastDate(String dateStr, int past) {
        Date date = dateStrToDate(dateStr);
        return dateToDateStr(getPastDate(date, past));
    }

    public static String getYesterday(String dateStr) {
        return getPastDate(dateStr, 1);
    }
    
    /**
     * 当前年周数:yyyy-w
     */
    public static String getYearWeek(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        //设置一周的第一天是周一
        cal.setFirstDayOfWeek(Calendar.MONDAY);

        int year = cal.get(Calendar.YEAR);
        int week = cal.get(Calendar.WEEK_OF_YEAR);

        cal.add(Calendar.DAY_OF_MONTH, -7);  //上一周

        //判断是否同一年,并且本周周数小于上周周数,则在上周周数的基础上加一
        if (year == cal.get(Calendar.YEAR) && week < cal.get(Calendar.WEEK_OF_YEAR)) {
            week = cal.get(Calendar.WEEK_OF_YEAR) + 1;
        }
        
        return year + "-" + week;
    }

    /**
     * 获取范围时间内的日期集合
     */
    public static List<String> getBetweenDays(String startDate, String endDate) {
        if (StringUtils.isBlank(startDate) || StringUtils.isBlank(endDate)) {
            return Collections.emptyList();
        }

        Date start = dateStrToDate(startDate);
        Date end = dateStrToDate(endDate);

        if (start.compareTo(end) > 0) {
            return Collections.emptyList();
        }

        // 返回的日期集合
        List<String> days = new ArrayList<>();
        Calendar tempStart = Calendar.getInstance();
        tempStart.setTime(start);

        Calendar tempEnd = Calendar.getInstance();
        tempEnd.setTime(end);
        tempEnd.add(Calendar.DATE, 1);
        while (tempStart.before(tempEnd)) {
            days.add(dateToDateStr(tempStart.getTime()));
            tempStart.add(Calendar.DAY_OF_YEAR, 1);
        }

        return days;
    }

}

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

Java常用日期工具实现 的相关文章

  • 14:00面试,14:06就出来了,问的问题有点变态。。。

    从小厂出来 没想到在另一家公司又寄了 到这家公司开始上班 加班是每天必不可少的 看在钱给的比较多的份上 就不太计较了 没想到9月一纸通知 所有人不准加班 加班费不仅没有了 薪资还要降40 这下搞的饭都吃不起了 还在有个朋友内推我去了一家互联
  • 史上最全的中高级 JAVA 工程师面试题汇总有哪些?

    你有面试机会了吗 近期 肯定有很多小伙伴 投出去的简历HR基本上都是已读不回 甚至都没有任何回复 或者平台默认筛选 你的简历HR根本就看不到 即使有些小伙伴简历通过 收到面试邀请了 结果被通知不用面试了 还有些小伙伴 有面试机会了 甚至已经
  • 真的干不过,00后整顿职场已经给我卷麻了,想离职了...

    在程序员职场上 什么样的人最让人反感呢 是技术不好的人吗 并不是 技术不好的同事 我们可以帮他 是技术太强的人吗 也不是 技术很强的同事 可遇不可求 向他学习还来不及呢 真正让人反感的 是技术平平 却急于表现自己的人 每天加班到12点 在老
  • 使用 TLS 1.2 将客户端连接到 TCP 服务器

    我尝试将设备连接到 Net 4 5 2 服务器 但没有成功 它是设备打开的 TCP 连接 使用 TLS 1 2 在服务器端 我有一个 TCP 服务器的标准 Net 实现 SslStream包裹着DotNetty https github c
  • 新入职一个00后卷王,每天加班到2点,太让人崩溃了····

    在程序员职场上 什么样的人最让人反感呢 是技术不好的人吗 并不是 技术不好的同事 我们可以帮他 是技术太强的人吗 也不是 技术很强的同事 可遇不可求 向他学习还来不及呢 真正让人反感的 是技术平平 却急于表现自己的人 每天加班到12点 在老
  • 2024诸多大厂春招提前启动!Android的程序员还在等什么

    春招 提前批 已开 xdm别打瞌睡了 格力 顺丰 酷狗 沃尔玛中国 理想 科大讯飞等开启春招 开始收简历了 还有hc的企业提前抢人 春招时间短 节奏快 招满即止 就算挂了也绝不能不投 对企业来说 秋招和春招都是储备人才的黄金时期 春招中 除
  • 2024拒绝行业内卷!八年软件测试20K*16薪行业心得 想入行必看

    目前工作做软件测试工作8年 属于高级测试员那个级别吧 现在看到各行各业的人都在转行学习软件测试 想给大家一些学习建议和忠告 很多粉丝都跟我说今年行情很差 找不到工资 真的找不到工作了吗 我们常在网上看到的 程序员饱和 程序员过剩 其实一般是
  • 最新整理Java面试八股文,大厂必备神器

    在看这篇文章之前 我想我们需要先搞明白八股文是什么 明清科举考试的一种文体 也称制义 制艺 时文 八比文 八股文章就四书五经取题 内容必须用古人的语气 绝对不允许自由发挥 而句子的长短 字的繁简 声调高低等也都要相对成文 字数也有限制 八股
  • 每个 UDP 数据报的 Netty 不同管道

    我们有一个已经在 TCP IP 中实现的服务器 但现在我们要求该协议也支持 UDP 发送的每个 UDP 数据报都包含我需要解码的所有内容 因此这是一个非常简单的回复和响应系统 数据报中的数据由换行符分隔 服务器启动时的引导代码如下所示 SE
  • 将无符号类型写入 Netty ChannelBuffer

    Netty 的 ChannelBuffer 类提供了从 ChannelBuffer 读取无符号类型的便捷方法 但是似乎没有任何等效的方法用于将无符号类型写入 ChannelBuffer 我觉得我一定错过了什么 推荐的方法是什么 例如将无符号
  • Netty:如何处理从 ChunkedFile 接收到的块

    我是 netty 新手 我正在尝试将分块文件从服务器传输到客户端 发送块工作得很好 问题在于如何处理接收到的块并将它们写入文件 我尝试的两种方法都会给我带来直接缓冲区错误 任何帮助将不胜感激 Thanks Override protecte
  • netty ChannelInboundHandlerAdapter 将帧裁剪为 ~1500 字节

    我已经实现了一个服务器应用程序 它使用 netty 框架通过 ChannelInblundHandlerAdapter 读取传入的字节 如标题所示 我的问题是 我不定期地从客户端获取内容 我认为这些内容在 1 500 字节后被剪切 例如 在
  • Netty连接限制

    我正在开发一个使用 netty 3 6 5 的应用程序服务器 我想先了解一下期权积压的完整含义 另外 为什么没有关于 serverbootstrap 选项的文档来帮助我们开发人员 我的另一个问题是如何最好地限制服务器的并发连接数以获得更好的
  • 与Netty相比,vert.x如何实现卓越的性能?

    最近的TechEmpower 性能基准 http www techempower com benchmarks 一直在 Netty 之上展示 vert x 有时数量很大 根据其网站 vert x 使用 Netty 来实现 大部分网络 IO
  • netty DefaultChannelPipeline 异常捕获

    不幸的是 我不明白 netty 服务器的输出 BUILD SUCCESSFUL Total time 3 seconds Jul 27 2014 2 04 44 AM io netty handler logging LoggingHand
  • netty 4.x.x 中的 UDP 广播

    我们需要使用 Netty 4 0 0 二进制文件通过 UDP 通道广播对象 Pojo 在 Netty 4 0 0 中 它允许我们仅使用 DatagramPacket 类来发送 UDP 数据包 此类仅接受 ByteBuf 作为参数 还有其他方
  • 不同的 Netty 版本及其用途

    我现在使用Netty有一段时间了 但永远无法解决这个问题 一个人可以下载四个不同的版本 其中三个正在积极开发中 3 x 4 0 x 4 1 x 5 x 据我了解 3 x 适用于 JRE 1 5 而 JRE 的其他所有版本都高于此版本 我使用
  • Netty:正确关闭 WebSocket

    如何从服务器端正确关闭 WebSocket 通道 连接 如果我使用一个ctx getChannel close the onerror在浏览器 Firefox 9 中抛出 页面加载时与 ws localhost 8080 websocket
  • 为什么我的 Camel Netty 路由会在 JMS 消息的开头添加换行符?

    我有一个 Camel Netty 路由 它将 XML 发送到服务器端口并将其放入 JMS 消息中 在第一条消息之后 所有其他消息的顶部都有一个换行符 导致当 GUI 收到它时 我的 XML 无法解组 我的路线是这样的
  • Netty通道读取混乱

    我三个月前开始使用 Netty 最初 它看起来非常简单且易于使用 因为我遵循了 4 x 系列主页中给出的示例 当我更深入地探索它时 我无法理解某些事件或回调名称 例如 我无法理解以下内容之间的区别 ChannelRead ChannelHa

随机推荐

  • Docker安装redis集群

    文章目录 1 Redis集群介绍 2 Redis 集群的数据分片 3 Redis 集群的主从复制模型 4 docker搭建Redis集群 3主3从 5 主从容错切换迁移案例 6 主从扩容案例 7 主从缩容案例 1 Redis集群介绍 Red
  • 时序预测

    时序预测 MATLAB实现PSO GRU 粒子群优化门控循环单元 时间序列预测 目录 时序预测 MATLAB实现PSO GRU 粒子群优化门控循环单元 时间序列预测 预测效果 基本介绍 模型介绍 PSO模型 GRU模型 PSO GRU模型
  • C++中的静态和动态多态

    之前学过继承 子类继承父类的属性 多态就是基于继承而来的 我们在如果只用继承 那么子类继承父类的各种属性在编译环节 就已经被确认了 导致代码不灵活 如果继承下来的某个子类不支持某种问题的解决 那么父类就需要重新编写代码 这样这个子类ok了
  • (四)为深度伪造预处理数据集

    目录 在Notebook上设置基础 提取视频帧 人脸检测和提取 下载项目文件 75 5 MB 深度伪造 使用深度学习在视频中将一个人的脸换成另一个人的脸 是当今使用人工智能的最有趣和最可怕的方式之一 虽然深度伪造可用于合法目的 但它们也可用
  • Redis新数据类型

    Bitmaps 1 简介 现代计算机用二进制 位 作为信息的基础单位 1个字节等于8位 例如 abc 字符串是由3个字节组成 但实际在计算机存储时将其用二进制表示 abc 分别对应的ASCII码分别是97 98 99 对应的二进制分别是01
  • C++实现简易图书馆管理系统

    目录 一 概要设计 二 详细设计 模块一 管理员模块 一 概要设计 二 详细设计 模块二 借阅者模块 一 概要设计 二 详细设计 模块三 初始界面模块 三 总结 一 概要设计 本程序为图书馆管理系统 按需求 本程序大致分为2个部分 其一是管
  • nodejs:三个点(...)是什么

    参考 JS中三个点 是什么鬼
  • IKE SA和IPSec SA的区别

    刚接触IPSec的时候 一直很奇怪 为什么要做两阶段的协商 先协商出来一个IKE SA 然后再IKE SA的基础上协商出来一个IPSec SA 直接一步到位协商出IPSec SA不是很好吗 但是在实际应用中 直接协商IPSec SA就显得不
  • 人工智能-动物识别系统

    在本系统当中 知识库中的知识用产生式规则来表示 共有如下15条规则 R1 IF该动物有奶THEN该动物是哺乳动物 R2 IF该动物有毛发THEN该动物是哺乳动物 R3 IF该动物有羽毛THEN该动物是鸟 R4 IF该动物会飞AND会下蛋TH
  • 《深入浅出深度学习》之“从逻辑学到认知科学”

    大家应该都听说过 在2016年 Google DeepMind 的AlphaGo 与韩国围棋大师李世石九段进行了著名的人机大战 并且取得完胜 媒体描述AlphaGo的胜利时 都提到了人工智能 Artificial Intelligence
  • MySQL数据库for CentOS7 yum安装、5.7.30编译安装和基础操作

    1 MySQL数据库简介 MySQL 是一种关系数据库管理系统 关系数据库将数据保存在不同的表中 而不是将所有数据放在一个大仓库内 这样就增加了速度并提高了灵活性 MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言 关系数据库管
  • 华为手机恢复出厂设置出现com.android.phone,如何在华为手机中恢复出厂设置?怎么在华为手机中一键还原?...

    如何在华为手机中恢复出厂设置 怎么在华为手机中一键还原 许多使用华为手机的小伙伴在使用一段时间手机过后 手机会变得有些卡顿 我们可以将手机恢复出厂设置来缓解手机卡顿的现象 今天 小编就教大家在华为手机中恢复出厂设置 具体如下 1 我们打开手
  • 一文讲完Java常用设计模式(全23种)

    文章目录 介绍 设计模式的六大原则 一 创建型模式 1 单例模式 Singleton Pattern 1 饿汉式 2 懒汉式 双检锁 3 静态内部类 4 枚举 2 原型模式 Prototype Pattern 3 工厂模式 Factory
  • js点击按钮改变文本

    h1 My Web Page h1 p A Paragraph p
  • linux环境下搭建宝塔(一键部署)

    了解宝塔 简单好用的服务器运维面板 宝塔Linux面板是提升运维效率的服务器管理软件 支持一键LAMP LNMP 集群 监控 网站 FTP 数据库 JAVA等100多项服务器管理功能 有30个人的专业团队研发及维护 经过200多个版本的迭代
  • Spring Boot 最核心的 25 个注解

    Spring Boot 最核心的 25 个注解 1 SpringBootApplication 这是 Spring Boot 最最最核心的注解 用在 Spring Boot 主类上 标识这是一个 Spring Boot 应用 用来开启 Sp
  • h5事件监听

    问题 点击div 或弹框 外的任何区域div 或弹框 消失 前情提要 项目是用angular写的移动端页面 测试反馈点击确认按钮每次都要点击2次才生效 体验很不好 需要优化 页面如下图所示 点击金额输入框键盘出现输入金额 键盘是单独封装的组
  • vi编辑器的使用(1)

    Linux 系统下的文本编辑器有很多种 包括图形模式下的gedit kwrite等 文本模式下的vi vim vi的增强版本 emacs等 其中vi和emacs是Linux系统中最常用的两个编辑器 本节主要介绍vi编辑器 主要内容包括 vi
  • Qt事件(消息)循环的源码分析之创建

    Qt程序的特点 Qt 是事件驱动的 尤其是你用Qt做界面开发时 你必须知道Qt的事件循环是如何开展的 从Win32到Qt 程序入口WinMain 创建窗口 进入事件 消息 循环 int main int argc char argv 入口m
  • Java常用日期工具实现

    获取今日日期 获取本月第一天日期 获取本月最后一天日期 date转日期字符串 日期字符串转date 日期字符串格式化 根据date获取past天前的日期 获取当前年周数 yyyy w 获取范围时间内的日期集合 public class My