日期和时间类【Date】【Calendar日历类】【LocalDate】Date-Time API详解

我们先来介绍一下与时间相关的基础知识。
GMT - 格林尼治标准时间(Greenwich Mean Time),简称GMT,实际上与世界时UT(universal time )基本一致。
UTC - 协调世界时(Universal Time Coordinated),简称UTC,比GMT更精确。
LT - 本地时间(Local Time),简称LT,表示所在时区的时间。
CST - 北京时间(China standard Time),中国标准时间。

时区:整个地球分为二十四时区,每个时区都有自己的本地时间。UTC或GMT与LT有如下换算关系:LT = UTC + 时区差。
东区是加相应的时区差,西区是减时区差。例如,CST-北京时间,在时区划分上,属东八区,比UTC协调世界时早8小时,记为UTC+8。

在这里插入图片描述

时间戳:UTC时间的原点是:1970年1月1日00:00:00。在中国,CST-北京时间比UTC协调世界时早8小时。因此,在中国,时间戳是自1970年1月1日(08:00:00GMT)至当前时间的总秒数,它也被称为Unix时间戳(unix Timestamp),广泛的应用在知识产权保护、合同签字、金融帐务、电子报价投标、股票交易等方面,作为时间标记。

另外,还有三个关于时间单位的换算公式:
(1)1秒 = 1000毫秒;
(2)1毫秒 = 1000微秒;
(3)1微秒 = 1000纳秒。

“逝者如斯夫,不舍昼夜”是《论语·子罕》中记载的孔子的名言。孔子在河边看到河水不断流淌,有感而发,形容时间就像这河水一样,不分昼夜地流逝,提醒人们要珍惜时间。这句话不仅表达了时间的流逝不可逆转,也寓意着人们应该珍惜每一刻,不要虚度光阴。
在计算机世界,我们是以1970 年 1 月 1 日 00:00:00作为基准时间,是UTC时间的原点。时间计算最常用的度量单位是毫秒(1秒的千分之一),时间是一维空间,如下图所示:
在这里插入图片描述
我们用long类型的变量来表示时间,从基准时间往前几亿年,往后几亿年都能表示。如果想获得当前时刻的“时刻数值”,代码如下:

	long now = System.currentTimeMillis();

这个“时刻数值”是所有时间类的核心值,年月日都是根据这个“数值”计算出来的。JDK 8 以前的时间日期相关类的关系如下所示:
在这里插入图片描述

一、 日期类Date

JDK 8以前的版本,通常用Date类(java.util.Date)来处理日期、时间:包括创建日期、时间对象;获取系统当前日期和时间等。
Date类用于表示日期和时间,是公历(阳历)表示法,表示特定的瞬间,精确到毫秒。Date类表示的日期和我们对日期的认知略有差异:

  • Date类定义的日期有一个起始点,是UTC时间:1970年1月1日00:00:00。
  • 年份由整数表示,但是Date类的年份是从1900年开始算起的,若Date类的年份为y,那么实际年份应当是 y + 1900。
  • 月份也由整数表示,Date类(java.util.Date)的月份是从0至11的整数表示,一月是0、二月是1,由此类推十二月是11。
  • 日期(一月中的某天)按通常方式由整数 1 至 31 表示,这点和我们的认知一致。
  • 小时由从 0 至 23 的整数表示。因此,从午夜到 1 a.m. 的时间是 0 点,从中午到 1 p.m. 的时间是 12 点,这点也和我们的认知一致。
  • 分钟按通常方式由 0 至 59的整数表示。

时间类Date有两个常用方法:
Date() 分配一个Date对象,并初始化此对象为系统当前的日期和时间,可以精确到毫秒。
long getTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

二、DateFormat类和SimpleDateFormat类

DateFormat类的作用:
把时间对象转化成指定格式的字符串。反之,把指定格式的字符串转化成时间对象。
DateFormat是一个抽象类,一般使用它的的子类SimpleDateFormat类来实现。

日期时间格式化占位符的含义:
在这里插入图片描述
Date日期时间类及其日期时间格式测试:

import java.text.SimpleDateFormat;
import java.util.Date;
public class testDate {
	public static void main(String[] args) throws Exception  {
        // 定义输出格式   
        SimpleDateFormat sdf = null;
        sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       
        Date date = new Date(); //获取系统当前日期
        System.out.println(date); //打印当前年月日
        System.out.println(date.getTime());//打印当前时间
        // 将日期转化为字符串
        String str = sdf.format(date);
        System.out.println(str);
        

        //把字符串转化为日期Date对象
        sdf = new SimpleDateFormat("yyyy年MM月dd日");
        String string = "2024年01月18日";
        date = sdf.parse(string);
        System.out.println(date); 
	}
}

测试效果结果:
在这里插入图片描述

三、Calendar日历类

Calendar 类是一个抽象类,为我们提供了关于日期计算的相关功能,比如:年、月、日、时、分、秒的展示和计算。
GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
注意 月份的表示,一月是0,二月是1,以此类推,12月是11。 因为大多数人习惯于使用单词而不是使用数字来表示月份,这样程序也许更易读,父类Calendar使用常量来表示月份:JANUARY、FEBRUARY等等。

Java语言对日期时间类Date的设计很差,日期的格式处理定义在java.text包中,而且java.util.Date是非线程安全的。
另外,在java.sql 包中有java.util.Date类的三个子类:
(1)java.sql.Date 只表示日期(JDBC日期转义格式:yyyy-mm-dd)
(2)java.sql.Time 只表示时间(JDBC时间转义格式:hh:mm:ss)
(3)java.sql.Timestamp 时间戳同时包含日期和时间信息(JDBC时间戳转义格式:yyyy-mm-dd hh:mm:ss.fffffffff)

JDK1.1之后,日期操作一般使用Calendar类,而字符串的转化使用DateFormat类的实现类SimpleDateFormat。

下面请看一个Calendar 类的演示例程:

/***
 * @author QiuGen
 * @description  CalenderDemos
 * @date 2024/9/18
 * ***/
import java.util.Calendar;
import java.util.GregorianCalendar;
public class CalenderDemos {
	public static void main(String[] args)
	{
		Calendar c =  new GregorianCalendar(); //创建公历日历
		prnWeek(c);
		c.set(2023, 8, 16);//设置为2023年 9月 16日
		prnWeek(c);
	}
 
	private static void prnWeek(Calendar c) {
		int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH)+1;
        int day = c.get(Calendar.DAY_OF_MONTH);
        //int week = c.get(Calendar.DAY_OF_WEEK);
        String week = getWeek( c.get(Calendar.DAY_OF_WEEK) );
 
        System.out.println(year+"年 "+month+"月 "+day+"日 "+week);
	}
 
	private static String getWeek(int week) 
	{
		 String[] weeks = { "","星期日" ,"星期一" ,"星期二" ,
"星期三" ,"星期四" ,"星期五" ,"星期六" };     
         return weeks[week];	
	}
}

测试结果:
在这里插入图片描述
四、Java 8的日期时间Date-Time API

JDK 1.0发布的日期时间类java.util.Date类有很大缺陷,自从JDK 1.1引入日历类Calendar之后Date类的很多方法就被弃用。然而日历类Calendar也不尽如人意。它们都是线程不安全的,而且都有不能处理闰秒(每隔2天,多出1s)等缺陷。
Java 8又引入了新的Date-Time API(JSR 310),也就是java.time包,来改善日期、时间的处理。
新版的日期时间处理类主要包含三个核心类:

  • LocalDate:表示日期(年-月-日),是不可变日期时间对象,采用了系统的默认时区。只包含日期,可以获取日期字段。
  • LocalTime:表示一天中的时间,只包含时间,可以获取时间字段。
  • LocalDateTime:包含了日期和时间,可以获取日期和时间字段,表示本地日期时间,默认使用系统时区。LocalDateTime相当于LocalDate + LocalTime的组合体。

新版的日期时间处理类还包含了一些辅助类:

  • Instant 时间戳类。Instant表示时间的瞬间,和前面Date类类似。相较于System.currentTimeMillis()只能获取到【毫秒】,Instant可以更为精确的获取到【纳秒】。Instant类提供了大量与Date类相互转换的方法。
  • Clock 时钟类。用于获取当时的时间戳,或当前时区下的日期时间信息。以前使用System.currentTimeMillis()和TimeZone.getDefault()方法的地方都可使用Clock来替换。
  • DateTimeFormatter 日期时间格式化类。

凡是需要显示日期和时间的地方,都可根据用户需求按一定样式规则进行格式化。下面是常用的日期时间格式化样式中用到的占位符:
在这里插入图片描述
常用的日期、时间格式化的样式:
年份:(占位符,用大小写皆可)
YYYY :4位数字表示的年份,例如:2023
yyyy :4位数字表示的年份,例如:2023
YY :2位数字表示的年份,例如:23
月份:(占位符M,必须用大写)
MM :2位数字表示的月份,例如:01表示一月,12表示十二月
MMM :英文缩写形式的月份,例如:Jan表示一月,Dec表示十二月
MMMM :完整的英文月份,例如:January表示一月,December表示十二月
日期:(DD大写,dd小写,皆可)
DD dd :2位数字表示的日期,例如:01表示1号,31表示31号
星期几:(占位符d,必须用小写)
ddd :英文缩写形式的星期几,例如:Mon表示星期一,Sun表示星期日
dddd :完整的英文星期几,例如:Monday表示星期一,Sunday表示星期日
时间:
HH :24小时制的小时,例如:00表示午夜12点,23表示晚上11点
hh :12小时制的小时,例如:01表示上午1点,12表示下午12点
mm :分钟,例如:00表示整点,30表示30分钟
ss :秒,例如:00表示整分,59表示59秒
S:毫秒,当前秒的毫秒数。
am/pm :上午/下午标识,例如:AM表示上午,PM表示下午。大小写皆可。

ISO本地化日期样式: yyyy-MM-dd
ISO本地化时间样式: HH:mm:ss

三个日期时间处理核心类都提供了静态now()方法来获取当前的系统日期或时间。例如:LocalDate类可用静态的now()方法来获取当前日期:
LocalDate localDate = LocalDate.now();

还定义了大量的日期时间处理方法,例如:通过加减计算日期的方法
在当前日期加上一定时间值计算今后的某个时间日期的方法:
localDate.plusDays(daysToAdd);
localDate.plusMonths(monthsToAdd);
localDate.plusYears(yearsToAdd);
在当前日期上减去一定时间值计算以前的某个时间日期的方法:
localDate.minusDays(daysToSubtract);
localDate.minusMonths(monthsToSubtract);
localDate.minusYears(yearsToSubtract);

Date-Time API中很多类都提供了闰年和平年的判断方法isLeapYear()。

老式使用Date()格式化显示的这种写法:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("【" + format.format(new Date()) + "】" );

与下面使用Date-Time API的写法,功能完全相同:

		String dateTime = LocalDate.now() + " " + LocalTime.now();
		System.out.println("【" + dateTime +"】");

例程DateTimeAPITest.java演示一些常用的方法,源代码如下:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class DateTimeAPITest {
	public static void testLocalDate() {
		LocalDate date = LocalDate.now(); //获取系统当前日期
        System.out.println(date);   //打印当前年月日
        System.out.println(date.getYear());//获取当前年份
        System.out.println(date.getMonth().getValue());//获取当前月份序号
        System.out.println(date.getDayOfMonth());//获取今天几号
        
        DateTimeFormatter f1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        System.out.println(date.format(f1));
	}
	public static void testLocalTime() {
        LocalTime time = LocalTime.now();
        System.out.println(time);//获取当前的时间
        System.out.println(time.getHour());//获取当前时间的小时
        System.out.println(time.getMinute());//获取当前时间的分钟
        System.out.println(time.getSecond());//获取当前时间的秒
        
        DateTimeFormatter f1 = DateTimeFormatter.ofPattern("HH:mm:ss");
        System.out.println(time.format(f1));
	}
	
	public static void testLocalDateTime() {
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println(dateTime);//获取当前的年月日时分秒
        System.out.println(dateTime.getYear());//获取当前年份
        System.out.println(dateTime.getMonth().getValue());//获取当前月
        System.out.println(dateTime.getDayOfMonth());//获取当前几日
        System.out.println(dateTime.getHour());//获取当前小时
        System.out.println(dateTime.getMinute());//获取当前分钟
        System.out.println(dateTime.getSecond());
        System.out.println(dateTime.getDayOfWeek());//今天是星期几

        DateTimeFormatter f1 = null;
		f1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println(dateTime.format(f1));
	}
	public static void main(String[] args)  {
		//testLocalDate();
		//testLocalTime();
		testLocalDateTime();
	}
}	//例程DateTimeAPITest.java结束。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matlab恢复默认窗口布局

1.点击主页,选择布局 2.选择默认,即可恢复到默认的窗口布局

Linux系统上搭建Vulhub靶场

Linux系统上搭建Vulhub靶场 ​vulhub​ 是一个开源的漏洞靶场,它提供了各种易受攻击的服务和应用程序,供安全研究人员和学习者测试和练习。要在 Linux 系统上安装和运行 vulhub​,可以按照以下步骤进行: 1. 安装 Docker 和 Docke…

C#软键盘设计字母数字按键处理相关事件函数

应用场景:便携式设备和检测设备等小型设备经常使用触摸屏来代替键盘鼠标的使用,因此在查询和输入界面的文本或者数字输入控件中使用软件盘来代替真正键盘的输入。 软键盘界面:软键盘界面实质上就是一个普通的窗体上面摆放了很多图片按钮&…

二叉树---java---黑马

二叉树 遍历 遍历分两种 广度优先遍历 尽可能先访问距离根节点最近的节点,也称之为层序遍历。 深度优先遍历 对于二叉树,进一步分为三种 pre-order前序遍历,对于每一颗子树,先访问该节点,然后是左子树&#xf…

探索RESTful风格的网络请求:构建高效、可维护的API接口【后端 20】

探索RESTful风格的网络请求:构建高效、可维护的API接口 在当今的软件开发领域,RESTful(Representational State Transfer)风格的网络请求已经成为构建Web服务和API接口的标配。RESTful风格以其简洁、无状态、可缓存以及分层系统等…

利用影刀实现批量发布文章的RPA流程(附视频演示)

前言 大家好,我是小智。在这篇文章中,我将分享一个实战案例,展示如何利用影刀实现批量发布文章的RPA流程。这里主要介绍其中一个简单步骤,其它步骤将通过视频演示。有使用方面的疑问可以留言。 影刀是一款强大的自动化工具&#x…

Java项目实战II基于Java+Spring Boot+MySQL的网上租贸系统设计与实现(开发文档+源码+数据库)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 "随着…

简单的云存储靶场

搭建靶场 我这里使用tx云,请自行搭建 https://shuihui2211-1329809954.cos.ap-nanjing.myqcloud.com 复现 私有读写 访问权限为私有读写时,我们访问url则会出现如下提示 目录遍历 漏洞成因 将policy权限设置为所有操作时 复现 我这里上传了一…

java-----异常

目录 异常:代表程序出现的问题 运行时异常和编译时异常的区别? 异常的作用: 异常的处理方式: 异常中常见的方法: 抛出异常: 自定义异常: 异常:代表程序出现的问题 Exception:叫做异常,代表程序可能出现的问题。…

Python 连接mysql数据库,并且执行查询

之前一直在写Java,但是随着python的崛起,自己也被慢慢的带入到了这样的一个阵营,学习python,了解机器学习 曾经有一个.... 不谈曾经,现在的我是一个小菜鸟,用学习Java实现业务的需求来学习python 项目的目…

科研绘图系列:R语言树结构聚类热图(cluster heatmap)

文章目录 介绍加载R包导入数据数据预处理画图修改图形导出数据系统信息介绍 热图结合树结构展示聚类结果通常用于展示数据集中的模式和关系,这种图形被称为聚类热图或层次聚类热图。在这种图中,热图部分显示了数据矩阵的颜色编码值,而树结构(通常称为树状图或聚类树)则显…

iptables限制网速

1、使用hashlimit来限速 #从eth0网卡进入INPUT链数据,使用模块hashlimit 限制网速为100kb/s或2mb/s,超过限制的数据包会被DROP。OUTPUT链同理,mode为srcip,有4个mode选项: srcip(默认匹配每个源地址IP,配置指定源地址…

计算机网络33——文件系统

1、chmod 2、chown 需要有root权限 3、link 链接 4、unlink 创建临时文件,用于非正常退出 5、vi vi可以打开文件夹 ../是向外一个文件夹 6、ls ls 可以加很多路径,路径可以是文件夹,也可以是文件 ---------------------------------…

Tcping:一款实用的端口存活检测工具

简介 tcping 是一个基于TCP协议的网络诊断工具,通过发送 TCP SYN/ACK包来检测目标主机的端口状态。 官网:tcping.exe - ping over a tcp connection 优点: (1)监听服务器端口状态:tcping 可以检测指定端口的状态,默认是80端口,也可以指定其他端口。 (2)显示ping返…

桌面便签哪个好用?好用的便签软件推荐?

随着信息技术的发展,我们的生活方式也发生了翻天覆地的变化。从纸质笔记本到电子便签,这不仅仅是载体的转换,更是思维习惯的一次革新。在这个数字时代,如何利用科技工具来辅助我们更好地管理时间和信息,成为了值得探讨…

Java刷题知识总结(一)

1.局部变量参与运算前是必须要初始化的,比如下面的代码就会编译出错,提示y必须要初始化。 public static void main(String[] args) {int x 1;int y;int z x y; } 2.ArrayList和Vector主要区别是什么? A Vector与ArrayList一样&#xf…

计算机毕业设计 扶贫助农系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

记一次Apache点击startup立马闪退的修复

人们总是在靠近幸福时患得患失 --生菜特斯拉 这两天频繁在各个虚拟机中使用apache搭建服务,但是时而会出现点击startup.bat启动脚本后立马出现闪退,所以记录一下。 一、环境复现 实验器材 1、win10虚拟机 2、apache项目 3、JDK(1.8&am…

Linux高级I/O:多路转接模型

目录 一.常见的IO模型介绍二.多路转接I/O1.select1.1.函数解析1.2. select特点和缺点1.3.基于 select 的多客户端网络服务器 2.poll2.1.poll函数解析2.2.poll特点和缺点2.3.基于poll的tcp服务器 3.epoll3.1.系列函数解析3.2.epoll原理解析2.3.基于 select 的多客户端网络服务器…

Java 入门指南:JVM(Java虚拟机)—— Java 类加载器详解

类加载器 类加载器(Class Loader)是 Java 虚拟机(JVM)的一部分,它的作用是将类的字节码文件(.class 文件)从磁盘或其他来源加载到 JVM 中。类加载器负责查找和加载类的字节码文件,并…