JAVA 获得特定格式时间

news2024/11/25 19:43:40

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);
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1053596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

侯捷 C++ STL标准库和泛型编程 —— 4 分配器 + 5 迭代器

4 分配器 4.1 测试 分配器都是与容器共同使用的&#xff0c;一般分配器参数用默认值即可 list<string, allocator<string>> c1;不建议直接用分配器分配空间&#xff0c;因为其需要在释放内存时也要指明大小 int* p; p allocator<int>().allocate(512,…

图像处理: ImageKit.NET 3.0.10704 Crack

关于 ImageKit.NET3 100% 原生 .NET 图像处理组件。 ImageKit.NET 可让您快速轻松地向 .NET 应用程序添加图像处理功能。从 TWAIN 扫描仪和数码相机检索图像&#xff1b;加载和保存多种格式的图像文件&#xff1b;对图像应用图像滤镜和变换&#xff1b;在显示屏、平移窗口或缩略…

【大家的项目】通用规则引擎——Rush(一)可以自定义的规则引擎,告别发版,快速配置...

前言 很长一段时间在搞过增长和促销的事情&#xff0c;在实现各种活动和玩法时非常心累。每个新的玩法&#xff0c;都需要填一点代码&#xff0c;每次改动都需要走流水线发一次版&#xff0c;烦躁且痛苦。 对于这种&#xff0c;输入不确定&#xff0c;过程不确定&#xff0c;结…

uni-app:官方文档中的canvas实例剖析

效果 代码 <template><view><!-- 创建了一个宽度为300像素&#xff0c;高度为200像素的canvas元素。canvas-id属性被设置为"firstCanvas"&#xff0c;可以用来在JavaScript中获取该canvas元素的上下文对象。 --><canvas style"width: 30…

【python海洋专题三】图像修饰之画布和坐标轴

【python海洋专题三】图像修饰之画布和坐标轴 海洋与大气科学 上期读取nc水深文件&#xff0c;并出图 但是存在一些不完美&#xff0c;本期修饰 本期内容目录 1&#xff1a;改变画布大小 2&#xff1a;改变画布背景色 3&#xff1a;改变画布在显示屏中的显示位置 4&#xf…

建筑能源管理(3)——建筑能源监管

为了全面落实科学发展观&#xff0c;提高建筑能源管理水平&#xff0c;进一步降低能源和水资源消耗、合理利用资源&#xff0c;以政府办公建筑和大型公共建筑的运行节能管理为突破口&#xff0c;建立了既有政府办公建筑和大型公共建筑运行节能监管体系&#xff0c;旨在提高政府…

[python 刷题] 刷题常用函数

[python 刷题] 刷题常用函数 最近直到未来一段时间之内应该都会用 python 刷题了&#xff0c;所以记一下碰到的还蛮好用的方法 按照分区实现&#xff0c;基本上刷一个类型的题&#xff0c;了解一些常用函数&#xff0c;就更新一下 这里假设你对编程语言有一定的了解&#xf…

Python海洋专题七之Cartopy画地形水深图的陆地填充

Python海洋专题七之Cartopy画地形水深图的陆地填充 第一期图 本期&#xff1a; 上期 Cartopy画地形水深图 但是陆地没有填充 如图 本期内容 陆地填充 如图&#xff1a; 详细过程如下 1&#xff1a;陆地填充 land feature.NaturalEarthFeature(‘physical’, ‘land’…

如何在Qt6中引入Network模块

2023年10月1日&#xff0c;周日凌晨 如果用的是CMake find_package(Qt6 COMPONENTS Network REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Network) 但在实际使用中&#xff0c;我发现有以下几点要注意&#xff1a; 1、要把“mytarget”换成项目名称 2、要去掉…

指针巩固习题

1.该程序输出的结果为 #include<stdio.h> int main() {int arr[]{1,2,3,4,5};short *p(short*)arr;//转化类型int i0;for(i0;i<4;i){*(pi)0;//short型指针1跳过两个字节}for(i0;i<5;i){printf("%d",arr[i]);}return 0;} 2.程序的输出结果为 #include&…

oracle-使用PLSQL工具自行修改用户密码

1、使用PLSQL工具&#xff0c;输入用户名和原密码登录&#xff0c;如下图 2、登录后&#xff0c;在会话下拉菜单中找到”Change password..” 3、在跳出的窗口中配置新密码&#xff0c;修改完成后单击”确认”&#xff0c;后退出PLSQL 4、重新打开PLSQL&#xff0c;使用新密码登…

1. windows安装elasticSearch

目录 1. 下载 2. 安装和启动 1. 下载 下载地址&#xff1a;https://elasticsearch.cn/download/ 下载7.8.0版本&#xff1a; 下载后的elasticsearch-7.8.0-windows-x86_64.zip文件放在本地合适的位置。 2. 安装和启动 解压elasticsearch-7.8.0-windows-x86_64.zip文件&…

蜂蜜配送销售商城小程序的作用是什么

蜂蜜是农产品中重要的一个类目&#xff0c;其受众之广市场需求量大&#xff0c;但由于非人人必需品&#xff0c;因此传统线下门店经营也面临着痛点&#xff0c;线上入驻平台也有很多限制难以打造自有品牌&#xff0c;无法管理销售商品及会员、营销等&#xff0c;缺少自营渠道&a…

DirectX12_Windows_GameDevelop_1:向量代数

引言 向量在计算机图形学、碰撞检测和物理模拟中扮演者关键的角色。因此在游戏开发之前我们必须先了解向量。本章研究向量的使用。 一、向量 如果你对数学中的向量不太熟悉&#xff0c;建议阅读《3D数学基础&#xff1a;图形和游戏开发 第2版》&#xff0c;如果你需要某些PD…

敏感性分析一览

敏感性分析 SobolMorrisFourier Amplitude Sensitivity Test (FAST)Random Balance Designs - Fourier Amplitude Sensitivity Test (RBD-FAST)Delta Moment-Independent MeasureDerivative-based Global Sensitivity Measure (DGSM)Fractional Factorial Sensitivity Analysis…

Flutter笔记:滚动之-无限滚动与动态加载的实现(GetX简单状态管理版)

Flutter笔记 无限滚动与动态加载的实现&#xff08;GeX简单状态管理版&#xff09; 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq…

Spring Framework 学习笔记5:事务

Spring Framework 学习笔记5&#xff1a;事务 1.快速入门 1.1.准备工作 这里提供一个示例项目 transaction-demo&#xff0c;这个项目包含 Spring 框架、MyBatis 以及 JUnit。 对应的表结构见 bank.sql。 服务层有一个方法可以用于在不同的账户间进行转账&#xff1a; Se…

云原生Kubernetes:对外服务之 Ingress

目录 一、理论 1.Ingress 2.部署 nginx-ingress-controller(第一种方式) 3.部署 nginx-ingress-controller(第二种方式) 二、实验 1.部署 nginx-ingress-controller(第一种方式) 2.部署 nginx-ingress-controller(第二种方式) 三、问题 1.启动 nginx-ingress-controll…

Python海洋专题五之水深地形图海岸填充

Python海洋专题五之水深地形图海岸填充 海洋与大气科学 上期读取nc水深文件&#xff0c;并出图 但是存在一些不完美&#xff0c;本期修饰 本期内容 障眼法&#xff1a;把大于零的数据填充为陆地的灰色&#xff1b; 把等于零的数据画等深线为陆地和海洋的分界线&#xff01;…

怒刷LeetCode的第21天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;哈希表 方法二&#xff1a;计数器数组 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;分治法 方法二&#xff1a;快速幂 迭代 方法三&#xff1a;快速幂 递归 第三题 题目来源 题目内容 …