JAVA 获得特定格式时间
0 背景
我们有时要获取时间,年月日时分秒周几,有时要以特定的格式出现。这时就要借助 SimpleDateFormat 或者 DateTimeFormatter。有时要某个月份有多少天需要借助 Calendar。所以有必要了解一些知识。
1 SimpleDateFormat
simpledateFormat 线程不安全,DateTimeFormatter 线程安全。
// 用法
String string = new SimpleDateFormat(String PATTERN, Locale locale).format(Date date);
PATTERN 的样式有很多。具体可以看源码。
public static final String STAND_TIME = "yyyy-MM-dd HH:mm:ss";
public static final String FULL_TIME = "yyyy-MM-dd HH:mm:ss.SSS";
public static final String YEAR_MONTH_DAY = "yyyy-MM-dd";
public static final String YEAR_MONTH_DAY_CN = "yyyy年MM月dd日";
public static final String HOUR_MINUTE_SECOND = "HH:mm:ss";
public static final String HOUR_MINUTE_SECOND_CN = "HH时mm分ss秒";
public static final String YEAR = "yyyy";
public static final String MONTH = "MM";
public static final String DAY = "dd";
public static final String WEEK = "E";
public static final String HOUR = "HH";
public static final String MINUTE = "mm";
public static final String SECOND = "ss";
public static final String MILLISECOND = "SSS";
2 Calendar
Calendar calendar = Calendar.getInstance();
// 设置一个日历
calendar.set(Calendar.DATE,int);
calendar.set(Calendar.MONTH,int);
calendar.set(Calendar.YEAR,int);
// 年月日的增加,可正可负
calendar.add(Calendar.DATE,int);
calendar.add(Calendar.MONTH,int);
calendar.add(Calendar.YEAR,int);
// 年月日的回滚,不会影响大字段。如增加日,不会影响月,31 -> 1,不改变月份。
calendar.roll(Calendar.DATE,int);
calendar.roll(Calendar.MONTH,int);
calendar.roll(Calendar.YEAR,int);
另外注意的参数
// week 是从星期天开始算的 1 - > 7
int a = calandar.get(Calendar.DAY_OF_WEEK);
// month 是从 0 开始的, 0 -> 11
int month = calendar.get(Calendar.MONTH);
3 时间工具 DateUtil
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.Objects;public class DateUtil {public static final String STAND_TIME = "yyyy-MM-dd HH:mm:ss";public static final String FULL_TIME = "yyyy-MM-dd HH:mm:ss.SSS";public static final String YEAR_MONTH_DAY = "yyyy-MM-dd";public static final String YEAR_MONTH_DAY_CN = "yyyy年MM月dd日";public static final String HOUR_MINUTE_SECOND = "HH:mm:ss";public static final String HOUR_MINUTE_SECOND_CN = "HH时mm分ss秒";public static final String YEAR = "yyyy";public static final String MONTH = "MM";public static final String DAY = "dd";public static final String WEEK = "E";public static final String HOUR = "HH";public static final String MINUTE = "mm";public static final String SECOND = "ss";public static final String MILLISECOND = "SSS";public static final String YESTERDAY = "昨天";public static final String TODAY = "今天";public static final String TOMORROW = "明天";/*** 获得当前时间** @return 例如 2023-09-29 10:00:00*/public static String getCurrentDateTime() {return new SimpleDateFormat(STAND_TIME, Locale.CHINESE).format(new Date());}/*** 获得当前完整时间** @return 例如 2023-09-29 10:00:00.123*/public static String getCurrentFullDateTime() {return new SimpleDateFormat(FULL_TIME, Locale.CHINESE).format(new Date());}/*** 获得今天年月日** @return 例如 2023-09-29*/public static String getCurrentYearMonthDay() {return new SimpleDateFormat(YEAR_MONTH_DAY, Locale.CHINESE).format(new Date());}/*** 获得年月日 中文版** @return 例如 2023年9月29日*/public static String getCurrentYearMonthDayCn() {return new SimpleDateFormat(YEAR_MONTH_DAY_CN, Locale.CHINESE).format(new Date());}/*** 获得年月日 自定义分隔符** @param delimiter 分隔符* @return 例如 2023/9/29*/public static String getCurrentYearMonthDayDelimiter(CharSequence delimiter) {return new SimpleDateFormat(YEAR + delimiter + MONTH + delimiter + DAY, Locale.CHINESE).format(new Date());}/*** 获得时分秒** @return 例如 10:00:00*/public static String getCurrentHourMinuteSecond() {return new SimpleDateFormat(HOUR_MINUTE_SECOND, Locale.CHINESE).format(new Date());}/*** 获得时分秒 中文版** @return 例如 10时00分00秒*/public static String getCurrentHourMinuteSecondCn() {return new SimpleDateFormat(HOUR_MINUTE_SECOND_CN, Locale.CHINESE).format(new Date());}/*** 获取时分秒 分隔符** @param delimiter 分隔符* @return 例如 2021/07/01*/public static String getCurrentHourMinuteSecondDelimiter(CharSequence delimiter) {return new SimpleDateFormat(HOUR + delimiter + MINUTE + delimiter + SECOND, Locale.CHINESE).format(new Date());}/*** 获得年** @return 例如 2023*/public static String getCurrentYear() {return new SimpleDateFormat(YEAR, Locale.CHINESE).format(new Date());}/*** 获得月** @return 例如 09*/public static String getCurrentMonth() {return new SimpleDateFormat(MONTH, Locale.CHINESE).format(new Date());}/*** 获得日** @return 29*/public static String getCurrentDay() {return new SimpleDateFormat(DAY, Locale.CHINESE).format(new Date());}/*** 获得时** @return 例如 10*/public static String getCurrentHour() {return new SimpleDateFormat(HOUR, Locale.CHINESE).format(new Date());}/*** 获得时分秒** @return 例如 00*/public static String getCurrentMinute() {return new SimpleDateFormat(MINUTE, Locale.CHINESE).format(new Date());}/*** 获得秒** @return 例如 00*/public static String getCurrentSecond() {return new SimpleDateFormat(SECOND, Locale.CHINESE).format(new Date());}/*** 获得毫秒** @return 例如 123*/public static String getCurrentMillisecond() {return new SimpleDateFormat(MILLISECOND, Locale.CHINESE).format(new Date());}/*** 获得当前时间戳** @return 例如 2023-9-29 10:00:00 为1695952800*/public static long getCurrentTimestamp() {return System.currentTimeMillis();}/*** 将时间转换成时间戳** @param time 时间* @return 返回时间戳 long*/public static long dateToStamp(String time) {SimpleDateFormat simpleDateFormat = new SimpleDateFormat(STAND_TIME, Locale.CHINESE);Date date = null;try {date = simpleDateFormat.parse(time);} catch (Exception e) {e.printStackTrace();}return Objects.requireNonNull(date).getTime();}/*** 将时间戳转换成时间** @param stamp 时间戳* @return 例如 2023-9-29 10:00:00*/public static String stampToDate(long stamp) {return new SimpleDateFormat(STAND_TIME, Locale.CHINESE).format(stamp);}/*** 返回今天是星期几** @return 例如 周五*/public static String getCurrentWeek() {return new SimpleDateFormat(WEEK, Locale.CHINESE).format(new Date());}/*** @param dateTime 日期 例如 2023-09-29* @return 例如 周五*/public static String getWeekOf(String dateTime) {Date date;if ("".equals(dateTime)) {date = new Date();} else {SimpleDateFormat sdf = new SimpleDateFormat(YEAR_MONTH_DAY, Locale.CHINESE);try {date = sdf.parse(dateTime);} catch (Exception e) {date = new Date();e.printStackTrace();}}return new SimpleDateFormat(WEEK,Locale.CHINESE).format(date);}/*** @param dateTime 日期 例如 2023-09-29* @return 例如 2023-09-28*/public static String getYesterdayOf(String dateTime) {SimpleDateFormat sdf = new SimpleDateFormat(YEAR_MONTH_DAY, Locale.CHINESE);Date date;try {date = sdf.parse(dateTime);} catch (ParseException e) {date = null;e.printStackTrace();}Calendar calendar = new GregorianCalendar();if (date != null) {calendar.setTime(date);}calendar.add(Calendar.DATE, -1);date = calendar.getTime();return new SimpleDateFormat(YEAR_MONTH_DAY, Locale.CHINESE).format(date);}/*** 获取输入日期的明天** @param dateTime 例如 2023-09-29* @return 例如 2023-09-30*/public static String getTomorrowOf(String dateTime) {SimpleDateFormat sdf = new SimpleDateFormat(YEAR_MONTH_DAY, Locale.CHINESE);Date date;try {date = sdf.parse(dateTime);} catch (ParseException e) {date = null;e.printStackTrace();}Calendar calendar = new GregorianCalendar();if (date != null) {calendar.setTime(date);}calendar.add(Calendar.DATE, +1);date = calendar.getTime();return new SimpleDateFormat(YEAR_MONTH_DAY, Locale.CHINESE).format(date);}/*** @param dateTime 一个时间 例如 2023-9-29* @return 相对今天而言是什么,比如今天是2023-9-30,返回昨天。*/public static String getDayInfoOf(String dateTime) {String dayInfo;String toDay = getCurrentYearMonthDay();String yesterday = getYesterdayOf(toDay);String tomorrow = getTomorrowOf(toDay);if (dateTime.equals(yesterday)) {dayInfo = YESTERDAY;} else if (dateTime.equals(toDay)) {dayInfo = TODAY;} else if (dateTime.equals(tomorrow)) {dayInfo = TOMORROW;} else {dayInfo = getWeekOf(dateTime);}return dayInfo;}/*** 返回当前月份的天数** @return 例如 9月份 返回30*/public static int getCurrentDaysOfMonth() {Calendar calendar = new GregorianCalendar();//把日期设置为当月第一天calendar.set(Calendar.DATE, 1);//日期回滚一天,也就是最后一天,roll 方法不更改大字段。calendar.roll(Calendar.DATE, -1);return calendar.get(Calendar.DATE);}/*** 返回指定年份月份的天数** @param year 年份 例如 2023* @param month 月份 例如 09* @return 例如 30*/public static int getDaysOfMothOf(int year, int month) {Calendar calendar = new GregorianCalendar();calendar.set(Calendar.YEAR, year);calendar.set(Calendar.MONTH, month - 1);//把日期设置为当月第一天calendar.set(Calendar.DATE, 1);//日期回滚一天,也就是最后一天,roll 方法不更改大字段。calendar.roll(Calendar.DATE, -1);return calendar.get(Calendar.DATE);}}
相关文章:

JAVA 获得特定格式时间
0 背景 我们有时要获取时间,年月日时分秒周几,有时要以特定的格式出现。这时就要借助 SimpleDateFormat 或者 DateTimeFormatter。有时要某个月份有多少天需要借助 Calendar。所以有必要了解一些知识。 1 SimpleDateFormat simpledateFormat 线程不安全…...

问题: 视频颜色问题,偏绿
参考 什么是杜比视界? - https://www.youtube.com/watch?vldXDQ6VlC7g 【哈士亓说】07:HDR、杜比视界究竟是个啥?为什么这个视频还不是HDR视频? - https://www.youtube.com/watch?vrgb9Xg3cJns 正文 视频应该是 杜比视界 电…...

智能文字识别技术——AI赋能古彝文保护
前言 人工智能在古彝文古籍保护方面具有巨大的潜力和意义。通过数字化、自动化和智能化的手段,可以更好地保护和传承古彝文的文化遗产,促进彝族文化的传承和发展。 文章目录 前言一、古彝文是什么?1.1古彝文的背景1.2古彝文古籍保护背景 二、…...
Linux压缩和解压命令大全:tar、gzip和zip完整教程
文章目录 linux中的压缩和解压命令简介什么是压缩和解压为什么要使用压缩和解压命令压缩命令tar命令创建.tar文件压缩目录压缩多个文件或目录 gzip命令压缩文件压缩后删除原文件压缩整个目录 zip命令创建.zip文件压缩文件或目录设置压缩级别 解压命令tar命令解压.tar文件解压到…...

Vue3 reactive和ref详解
reactive Vue3.0中的reactive reactive 是 Vue3 中提供的实现响应式数据的方法。在 Vue2 中响应式数据是通过 defineProperty 来实现的,在 Vue3 中响应式数据是通过 ES6 的 Proxy来实现的。reactive 参数必须是对象 (json / arr)如果给 reactive 传递了其它对象 默…...

jvs-rules(规则引擎)和jvs智能bi(自助式数据分析)9.22更新内容
规则引擎更新功能 新增: 1.新增节点匹配筛选 用于做多个条件的数据筛选,以便将符合条件的数据传递给下一个节点进行处理,通常用于实现复杂的查询逻辑。 2.复合变量节点新增判断条件选项说明 用户可以根据自己的需求,为复合变量节点添加不…...

Leetcode算法题练习(一)
目录 一、前言 二、移动零 三、复写零 四、快乐数 五、电话号码的字母组合 六、字符串相加 一、前言 大家好,我是dbln,从本篇文章开始我就会记录我在练习算法题时的思路和想法。如果有错误,还请大家指出,帮助我进步。谢谢&…...
Xilinx FPGA 7系列 GTX/GTH Transceivers (5)-- Aurora 8b10b 信号传输实战--小试牛刀
第一节:Xilinx FPGA 7系列 GTX/GTH Transceivers (1)–了解了GTX硬件的基础知识 第二节:IBERT GTX --通过Ibert IP测试链路通信 第三节:aurora 8b10b single lane 4byte–学习官方历程 第四节:aurora 8b10b single lane 4byte–修改官方例子,发收递增数。 GTX/GTH Transc…...
第三章:最新版零基础学习 PYTHON 教程(第七节 - Python 运算符—Python 成员身份和身份运算符)
Python 提供了两个成员资格运算符来检查或验证值的成员资格。它测试序列(例如字符串、列表或元组)中的成员资格。 in 运算符: “in”运算符用于检查序列中是否存在字符/子字符串/元素。如果在序列中找到指定元素,则求值为 True,否则求值为 False。例如, CSDNforCSDN 中…...

【Java 基础篇】Java 注解详解
在 Java 编程中,注解(Annotation)是一种元数据,它提供了关于程序代码的额外信息。注解不直接影响程序的执行,但可以在运行时提供有关程序的信息,或者让编译器执行额外的检查。 本文将详细介绍 Java 注解的…...
MVVM框架下两窗口的消息传递
副窗口关闭的时候将bool类型传递出去 var message new CloseWindowMessage {MedicineView_DialogResult true }; //CloseWindowMessage是存储bool类型的标记类 Messenger.Default.Send(message); 主窗体中添加关闭处理的方法 private void HandleCloseWindowMessage(Clo…...

ROS2 从头开始:第6部分 - ROS2 中的 DDS,用于可靠的机器人通信
一、说明 在这篇文章中,我们将重点关注 ROS 2的通信栈DDS,其中这是介于管理节点通信与控制节点通信环节,是上位机决策体系与下位机的控制体系实现指令-执行-反馈的关键实现机制。 二、ROS工程的概念框架 现代机器人系统非常复杂,因为需要集成各种类型的传感器、执行器和其…...

WebSocket的那些事(6- RabbitMQ STOMP目的地详解)
目录 一、目的地类型二、Exchange类型目的地三、Queue类型目的地四、AMQ Queue类型目的地五、Topic类型目的地 一、目的地类型 在上节 WebSocket的那些事(5-Spring STOMP支持之连接外部消息代理)中我们已经简单介绍了各种目的地类型,如下图&…...
SQL SELECT 语句基础
在数字化的世界中,数据已经成为了一种无处不在的资源。从游戏开发到商业智能,数据分析都是不可或缺的一部分。SQL(结构化查询语言)是一种用于与数据库进行交互的编程语言,而SELECT 语句则是其中最基础也最常用的查询方式。 本文将通过对《三国志》游戏的角色数据进行分析…...

golang工程——protobuf使用及原理
相关文档 源码:https://github.com/grpc/grpc-go 官方文档:https://www.grpc.io/docs/what-is-grpc/introduction/ protobuf编译器源码:https://github.com/protocolbuffers/protobuf proto3文档:https://protobuf.dev/programmin…...

CocosCreator3.8研究笔记(二十三)CocosCreator 动画系统-动画编辑器相关功能面板说明
国庆假期,闲着没事,在家研究技术~ 上一篇,我们介绍了动画剪辑、动画组件以及基本的使用流程,感兴趣的朋友可以前往阅读: CocosCreator 动画系统-动画剪辑和动画组件介绍。 今天,主要介绍动画编辑器相关功能…...

免费 AI 代码生成器 Amazon CodeWhisperer 初体验
文章作者:浪里行舟 简介 随着 ChatGPT 的到来,不由让很多程序员感到恐慌。虽然我们阻止不了 AI 时代到来,但是我们可以跟随 AI 的脚步,近期我发现了一个神仙 AI 代码生产工具 CodeWhisperer ,它是一项基于机器学习的服…...

谷歌扩展下载
Chrome 扩展下载安装网站推荐 # 1. 极简插件优质crx应用 ●地址:https://chrome.zzzmh.cn ●推荐:★★★★★ 一个非常良心 & 干净 & 简洁的 Chrome 扩展下载网站,体验非常不错! 侧边栏可以通过类型对扩展进行筛选和排序&…...

Mac上如何修复损坏的音频?试试iZotope RX 10,对音频进行处理,提高音频质量!
iZotope RX 10是一款由iZotope公司开发的音频修复和编辑软件。它被广泛用于电影、电视、音乐和游戏等行业的音频后期制作,以及声音设计和修复工作。 在RX 10中,iZotope从头开始重新设计了全新的Repair Assistant修复助手,并且推出了相应的修…...

Mysql各种锁
一.不同存储引擎支持的锁机制 Mysql数据库有多种数据存储引擎,Mysql中不同的存储引擎支持不同的锁机制 MyISAM和MEMORY存储引擎采用的表级锁 InnoDB存储引擎支持行级锁,也支持表级锁,默认情况下采用行级锁 二.锁类型的划分 按照数据操作…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...

STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...