从零开始学Java62之时间相关的类有哪些?_at java

本文介绍了Java中关于时间处理的关键概念,包括Locale表示的本地化信息、夏令时的处理、EpochTime和时间戳的定义,以及Date和Calendar类的使用方法,涉及日期格式化、时间差计算和时区转换等内容。
摘要由CSDN通过智能技术生成

4. 本地化

本地化并不只包括时间这一种信息,还包括一个国家或地区所采用的日期、时间、数字、货币等各种信息的格式,开发时通常使用Locale进行表示。Locale由“语言_国家”的字母缩写构成,如“zh_CN”就表示“中文+中国”,“en_US”表示“英文+美国”。其中语言是小写,国家是大写。

而对于不同国家或地区的Locale日期部分来说,如中国和美国的本地时间表示方式如下:

● zh_CN:2023-01-24

● en_US:01/24/2023

5. 夏令时

夏令时(Daylight Saving Time:DST),也叫夏时制,又称“日光节约时制”,是一种为了节约能源而人为规定地方时间的制度。 一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。

我们国家曾经实行过一段时间夏令时,但在1992年就废除了,不过美国人到现在还在使用。所以涉及到跨国应用开发时,相关时间的换算可能会有点复杂。因为涉及到夏令时,相同的时区,如果表示的方式不同,转换出的时间也是不同的。

6. Epoch Time时间起点

Epoch Time是一个固定的通用时间,即世界标准时间(UTC) 1970-01-01 00:00:00 UTC,它是计算机里时间开始的起点,该起点被记为0,而1970年以前的时间被认为是负数。

我们知道,现实世界的时间谁也不知道是从什么时候开始的,但是计算机发明的时间并不长,为了方便大家进行各种开发和计算,于是国际标准委员会就给计算机设置了一个时间的起点。以这个时间为起点,每过去一秒,该数值就加1,这样我们就可以算出对应的公历时间日期(不包括闰秒)。Epoch Time在不同的编程语言中,会有几种不同的存储方式:

● 以秒为单位的整数:1574208900,缺点是精度只能到秒;

● 以毫秒为单位的整数:1574208900123,最后3位表示毫秒数;

● 以秒为单位的浮点数:1574208900.123,小数点后表示零点几秒。

7. 时间戳

时间戳(timestamp),也称为Unix时间 或 POSIX时间,它是一种时间表示方式。

表示从1970年1月1日0时0分0秒(格林尼治时间)开始,一直到现在所经过的秒数或毫秒数。在Java一般是用long类型来存储该值,但在别的编程语言中有可能是使用float类型。比如1574208900就表示从1970年1月1日零点开始,到2019年11月20日8点15分截止,一共经历了1574208900秒,所以换算成北京时间就是:1574208900 = 北京时间2019-11-20 8:15:00。如果我们要获取当前的时间戳,在Java中可以使用System.currentTimeMillis()方法。

从本质上来说,时间戳就是个时间差值,其值与时区无关。比如在UTC标准下,时间起点的时间戳就是timestamp = 0 = 1970-1-1 00:00:00 UTC+0:00,此时对应的北京时间是timestamp = 0 = 1970-1-1 08:00:00 UTC+8:00

了解了以上这些基本概念之后,我们就可以继续往下学习今天其他的内容了。

二. Date日期时间类

1. 简介

如果我们想在Java中获取当前的时间,可以使用 java.util.Date类java.util.Calendar类来实现。其中,Date类封装了系统的日期和时间信息,Calendar类则会根据系统的日历来填充Date对象。

java.util.Date是一个表示日期和时间的类,代表了系统特定的时间戳。它是按照UTC时间显示的,可以精确到毫秒,源码内部使用long类型进行时间的存储。我们要注意与java.sql.Date区分,后者是用在数据库中的类,且是按照本地时区显示的。Date对象表示的时间,其默认顺序是星期、月、日、小时、分、秒、年。

2. 构造方法

java.util.Date类给我们提供了多个构造方法,如下图所示:

在这里插入图片描述

但是一般在开发时,我们常用的也没有这么多,一般使用时如下形式:

● Date():创建Date对象并初始化,该对象可以获取本地的当前时间,该时间会精确到毫秒。

● Date(long date):构造一个Date对象,并接受一个从1970年1月1日起的毫秒数作为参数。

3. 常用API方法

当我们构造出来一个Date对象之后,就可以使用它的一些API方法进行时间的操作了,这些常用的API方法如下:

序号方法和描述
boolean after(Date date)若调用该方法的Date对象,在指定的日期之后,则返回true,否则返回false。
boolean before(Date date)若调用此方法的Date对象,在指定的日期之前,则返回true,否则返回false。
int compareTo(Date date)比较调用此方法的Date对象和指定的日期。若两者相等则返回0,若该对象在指定日期之前则返回负数,若该对象在指定日期之后则返回正数。
boolean equals(Object date)若调用该方法的Date对象,和指定日期相等时则返回true,否则返回false。
long getTime( )返回自1970年1月1日 00:00:00 GMT以来的毫秒数。
void setTime(long time)用从1970年1月1日00:00:00 以后的time毫秒数,设置时间和日期。
String toString( )把该Date对象转换成dow mon dd hh:mm:ss zzz yyyy格式的字符串,其中dow是指一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。

4. 使用方法

4.1 基本使用

接下来我们先通过一个简单的案例,来演示一下Date的基本用法。

import java.util.Date;
public class Demo01 {

	public static void main(String[] args) {
		//获取当前时间的时间戳
		long currentTimeMillis = System.currentTimeMillis();
		System.out.println("时间戳="+currentTimeMillis);
		
		//获取当前时间对象
		Date date=new Date();
		//Sat Feb 11 12:04:03 IRKT 2023
		System.out.println("当前时间="+date);
		//转为字符串:Sat Feb 11 12:04:03 IRKT 2023
		System.out.println("当前时间="+date.toString());
		//转换为本地时区:2023年2月11日 下午12:04:03
		System.out.println("当前时间,Locale="+date.toLocaleString());
		//转换为GMT时区:11 Feb 2023 04:04:03 GMT
		System.out.println("当前时间,GMT="+date.toGMTString());
	}
}

如果我们想获取当前时间的时间戳,可以使用System.currentTimeMillis()方法。构造出Date对象之后,我们可以直接打印该对象,就能展示出当前时间,但是这个格式并不一定符合我们中国人的阅读习惯,后面我们可以对日期进行格式化操作。

4.2 其他用法

除了上面这些基本用法之外,Date还有其他的一些用法。

import java.util.Date;
public class Demo01 {

	public static void main(String[] args) {
		//获取当前时间对象
		Date date=new Date();
		//获取年月日
		System.out.println("年="+(date.getYear() + 1900)); // 必须加上1900
        System.out.println("月="+(date.getMonth() + 1)); // 0~11,必须加上1
        System.out.println("日="+date.getDate()); // 1~31,不能加1
        System.out.println("时="+date.getHours()); // 0~23
        System.out.println("分="+date.getMinutes()); // 0~59,不能加1
        System.out.println("秒="+date.getSeconds()); // 0~59,不能加1
        System.out.println("时间戳="+date.getTime()); // 时间戳,毫秒值
		
		//计算自己已经活了多少天,1990年01月31日
		//构造对象的另一个方法,已过时。year:要减去1900,月份从0开始,0-11;日期是1-31
        Date d1 =  new Date(1990-1900, 2-1, 31);
        Date d2 = new Date();
        long time = d2.getTime() - d1.getTime();
        System.out.println("已活天数="+time/1000/60/60/24);

        
	}
}

另外我们还要注意,getYear()方法返回的年份必须加上1900;getMonth()方法返回的月份是0-11,分别表示1-12月,所以要加1;而getDate()方法返回的日期范围是1~31,就不能加1。

在打印本地时区表示的日期和时间时,不同的计算机可能会有不同的展示结果,后面我们可以使用SimpleDateFormat设置出我们想要的日期时间格式。

4.3 统计时间差

有时候我们要统计某个功能的执行时间,此时就可以用该功能结束时的时间,减去开始时的时间,得到一个时间差,这就是该功能的执行时间。

import java.util.Date;

public class Demo03 {

	public static void main(String[] args) {
		//获取当前时间对象
		//开始时间
		Date startDate=new Date();
		
		for(int i=0;i<100000;i++) {
			System.out.println("循环次数"+i);
		}
        		
		//结束时间
		Date endDate=new Date();
		//计算时间差
        long time = endDate.getTime() - startDate.getTime();
        System.out.println("10w次循环的执行时间是 "+time+" 毫秒");
	}
	
}

三. Calendar日历类

1. 简介

Calendar类是Java时间类Date的扩展。

相比Date,它拥有更强大的功能,主要是多了可以做简单日期和时间运算的功能,且在实现方式上也比Date类更复杂一些。Calendar可以用来计算日期,比如说计算下个月的日期,或者两个月前的日期等。

Calendar类是一个抽象类,我们在实际使用时需要实现特定的子类,一般使用getInstance()方法创建即可。Calendar类有几个主要的子类,包括java.util.GregorianCalendar和java.util.TimeZone。其中GregorianCalendar类提供了标准的日历系统,可以用来计算未来或过去某天的日期。TimeZone类则可以用来在不同的时区之间,转换日期和时间。

2. Calendar常量字段

Calendar中有以下几个常用的常量字段,用于表示不同的意义。

常量描述
Calendar.YEAR年份
Calendar.MONTH月份
Calendar.DATE日期
Calendar.DAY_OF_MONTH日期,和上面的字段意义完全相同
Calendar.HOUR12小时制的小时
Calendar.HOUR_OF_DAY24小时制的小时
Calendar.MINUTE分钟
Calendar.SECOND
Calendar.DAY_OF_WEEK星期几

3. Calendar常用方法

除了以上常用的常量字段之外,Calendar还有一些常用的方法,如下表所示:

方法描述
void add(int field, int amount)根据日历的规则,为给定的日历字段 field 添加或减去指定的时间量 amount
boolean after(Object when)判断此 Calendar 表示的时间是否在指定时间 when 之后,并返回判断结果
boolean before(Object when)判断此 Calendar 表示的时间是否在指定时间 when 之前,并返回判断结果
void clear()清空 Calendar 中的日期时间值
int compareTo(Calendar anotherCalendar)比较两个 Calendar 对象表示的时间值(从格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒至现在的毫秒偏移量),大则返回 1,小则返回 -1,相等返回 0
int get(int field)返回指定日历字段的值
int getActualMaximum(int field)返回指定日历字段可能拥有的最大值
int getActualMinimum(int field)返回指定日历字段可能拥有的最小值
int getFirstDayOfWeek()获取一星期的第一天。根据不同的国家地区,返回不同的值
static Calendar getInstance()使用默认时区和语言坏境获得一个日历
static Calendar getInstance(TimeZone zone)使用指定时区和默认语言环境获得一个日历
static Calendar getInstance(TimeZone zone,Locale aLocale)使用指定时区和语言环境获得一个日历
Date getTime()返回一个表示此 Calendar 时间值(从格林威治时间1970 年 01 月 01 日 00 时 00 分 00 秒至现在的毫秒偏移量)的 Date 对象
long getTimeInMillis()返回此 Calendar 的时间值,以毫秒为单位
void set(int field, int value)为指定的日历字段设置给定值
void set(int year, int month, int date)设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值
void set(int year, int month, int date, int hourOfDay,int minute, int second)设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、 MINUTE 和 SECOND 的值
void setFirstDayOfWeek(int value)设置一星期的第一天是哪一天
void setTimeInMillis(long millis)用给定的 long 值设置此 Calendar 的当前时间值

Calendar对象可以调用set()方法将日历翻到任何一个时间,当参数 year取负数时表示是公元前。调用 get()方法可以获取年、月、日等时间信息,field参数的值是前面讲过的Calendar静态常量。

4. 构建Calendar对象

Calendar类是抽象类,所以我们不能通过new的方式来构建Calendar对象。在实际使用时,我们一般是要实现特定的子类,经常是使用getInstance()方法进行创建。

import java.util.Calendar;

public class Demo04 {

	public static void main(String[] args) {


### 给大家的福利


**零基础入门**


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


![](https://img-blog.csdnimg.cn/img_convert/95608e9062782d28f4f04f821405d99a.png)


同时每个成长路线对应的板块都有配套的视频提供:


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a91b9e8100834e9291cfcf1695d8cd42.png#pic_center)


因篇幅有限,仅展示部分资料


网络安全面试题


![](https://img-blog.csdnimg.cn/img_convert/80674985176a4889f7bb130756893764.png)


绿盟护网行动


![](https://img-blog.csdnimg.cn/img_convert/9f3395407120bb0e1b5bf17bb6b6c743.png)


还有大家最喜欢的黑客技术


![](https://img-blog.csdnimg.cn/img_convert/5912337446dee53639406fead3d3f03c.jpeg)


**网络安全源码合集+工具包**


![](https://img-blog.csdnimg.cn/img_convert/5072ce807750c7ec721c2501c29cb7d5.png)


![](https://img-blog.csdnimg.cn/img_convert/4a5f4281817dc4613353c120c9543810.png)

**所有资料共282G**,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值