javaSE常用类(二)—— 日期类

目录

一、JDK 8之前日期类

1.1 java.lang.System类

1.2  java.util.Date类

 1.3 java.sql.Date类

​编辑

1.4 java.text.SimpleDateFormat类

​编辑

 1.5 Calendar类

1.实例化

2. 其他常用方法

二、JDK 8的日期类

 2.1  LocalDate类、LocalTime类、LocalDateTime类(常用)       

1. 实例化

2. 其他常用方法

2.2 Instant类

1.实例化

 2. 其他常用方法

 2.3 DateTimeFormatter类(相当于SimpleDateFormat)


前言

        Date类有些过时了,因为Date类的格式是这样的 “Sat Feb 04 17:11:30 CST 2023”,太难看了,不利于国际上的统一。

        于是有了SimpleDateFormat类,专门用来把Date的丑格式,改成自定义的漂亮格式,常用的格式便是“yyyy-MM-dd hh:mm:ss”这样的。

        Calendar类用来替代Date类(因为Date类过时嘛),但是Calendar的缺点是不能自定义格式,因为SimpleDateFormat只能规范Date类的格式。

        JDK 8后出现了LocalDateTime类取代Date类,DateTimeFormatter类去取代SimpleDateFormat类,同样DateTimeFormatter类是为LocalDateTime类自定义格式用的。

一、JDK 8之前日期类

1.1 java.lang.System类

常用的是System类中的静态方法currentTimeMillis(),返回的是从1970年1月1日0时0分0秒到现在的时间,以毫秒为单位,long型数据。常用来计算时间差,或者某段代码的执行时间

 在项目中可用于生成唯一的名称(比如生成唯一的订单号,Triton项目当时生成的唯一jpg名称),如果每毫秒有多个产出,那还需要搭配随机数一起使之唯一化。

1.2  java.util.Date类

PS:还有一个Date类,是java.sql.Date类,是其子类

java.util.Date

        |------java.sql.Date

 记忆点

(1)还能用(不算过时)两个构造器

(2)还能用(不算过时)的两个方法

(3)过时

 偏移性:Date中的年份从1900开始,月份从0开始。如果我们要新建一个2020年9月8日的Date类对象,要减去偏移量,所以这种构造方式过时了没人用!

(3)Date类的API由于不易于国际化,已经过时了,它的很多方法都加了“Deprecated”注解。推荐使用Calendar类。

 1.3 java.sql.Date类

记忆点

(1)实例化

(2)如何将java.util.Date类转化为java.sql.Date类

java.sql.Date类对应着sql数据库中date类型的变量

 也就是说,如果我们要和sql进行交互,应该用java.sql.Date这个类去接收。

(1)如何实例化

(2)如何将java.util.Date类转化为java.sql.Date类——运用的是二者方法上的逻辑关系

1.4 java.text.SimpleDateFormat类

由于Date类不易于国际化,SimpleDateFormat便是对Date类的格式化和解析。

记忆点

(1)实例化

(2)两个常用方法

        ①格式化format(): 日期Date类------>字符串

        ②解析(格式化的逆过程)parse():字符串------>日期Date类

(3)异常

        用到parse()的方法需要抛出ParseException,当输入的字符串与pattern不匹配就会报这个异常。

 

 由于默认构造器解析出来的格式不顺眼很别扭,我们一般使用有参构造器指定格式进行开发:

  • y:年
  • M:大写的M代表月份(为了和minutes区分开)
  • d 天
  • h 小时
  • m 分钟
  • s秒

在项目开发中,我们一般使用“yyyy-MM-dd hh:mm:ss”这种格式 

还可以任意指定其他格式:

 1.5 Calendar类

记忆点:

(1)实例化

        ① 对象上转型。new一个子类对象GregorianCalendar

        ② 利用Calender类的startic方法getInstance(一般用这个)。

(2)其他常用方法

(3)一月是0,二月才是1;周日是1,周一是2,周六是7

1.实例化

因为Calendar是一个abstract方法,所以本身不能实例化。 实例化的方法有两个

        ① 对象上转型。new一个子类对象GregorianCalendar

        ② 利用Calender类的startic方法getInstance(一般用这个)。

2. 其他常用方法

(1)get( )

Calendar类里有很多static final修饰的变量。可以使用类名直接调用这些静态变量,比如Calendar.DAY_OF_WEEK,作为get等方法的参数,获取“今天是一年的第几天”,“一周的第几天”,“一月的第几天”等信息。这些变量并不存储“一年的第几天”等信息,他们只是一个名字或者标志而已。

(2)set( )

        不要理解成“把今天改成今年的第1天”,这样很奇怪,因为今天明明是今年的第201天呀。
要理解成吧cal这个对象改成今年的第1天。用途:比如说题目指定了计算2022年1月1日,但是我们实例化的calendar对象却是今天,就可以用set把它改掉。

(3)add( )

        cal.add(Calendar.DAY_OF_YEAR,30);  //cal往后加30天
        System.out.println(cal.get(Calendar.DAY_OF_YEAR));
        System.out.println(cal.get(Calendar.YEAR));  //输出2022年
        
        cal.add(Calendar.MONTH,18);  //往后加18个月,12个月多出来的加到下一年
        System.out.println(cal.get(Calendar.MONTH));
        System.out.println(cal.get(Calendar.YEAR));  //输出2023年

calendar并没有minus方法,如果要往前推多少天或者多少月,把数值改成负数就行了。 

(4)getTime( ) :calendar类------>Date类

用一个例子来理解其应用:把2021年9月28号打印成yyyy-MM-dd格式输出。思路是“先实例化calendar对象,用YEAR,MONTH,DATE指定月日年,然后Calendar对象--->Date类对象--->SimpleDateFormat类对象”。

        cal.set(Calendar.YEAR,2021);
        cal.set(Calendar.MONTH,8);  //注意,Month=实际月份-1
        cal.set(Calendar.DATE,28);
        Date date = cal.getTime();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(sdf.format(date));

(5)setTime( ) :Date类------>calendar类

        Calendar cal = Calendar.getInstance();
        Date date = new Date();
        cal.setTime(date);

二、JDK 8的日期类

JDK 8之前存在的问题:

(1)可变性:像日期和时间这样的类应该和string一样是不可变的,或者说一旦发生变化就得重新构造一个对象,但是上面Calendar类中我们可以用set方法对对象本身进行改变。

(2)格式化:虽然Date过时了推荐用Calendar,但是SimpleDateFormat只能对Date进行格式化,不能对Calendar格式化。

(3)偏移性:Date中的年份从1900开始,月份从0开始。如果我们要新建一个2020年9月8日的Date类对象,要减去偏移量

(4)缺少synchronize方法,不是线程安全的

(5)不能处理润秒

        使用JDK 7时,已经有人感觉java自带的日期类使用起来有很多弊端,所以自己写了Joda-Time这个jar包(可以通过maven导入),后来Sun公司认为Joda-Time确实不错,直接把这个jar包的API写入到JDK 8中。

PS:如果公司用的还是JDK 7,又想使用JDK 8中新的类,可以通过maven导入Joda-Time这个jar包。

 

 2.1  LocalDate类、LocalTime类、LocalDateTime类(常用)       

1. 实例化

和Calendar实例化调用getInstance()方法一样,这3个类的实例化也不是直接调用构造器,而是调用和getInstance()一样的静态方法。

(1)now()方法:当前时间实例化

(2)of()方法:自定义时间实例化

不再具有偏移性,实例化的时候就写真实的年月日。

2. 其他常用方法

(1)getXxx()获取年、月、日、时、分、秒

以LocalDateTime类的对象为例

 (2)withXxx()设置 年、月、日、时、分、秒

具有不可变性!

 (3)plusXxx()增加

具有不可变性!

 (4)minus() 减少

和Calendar用负数不同,JDK 8的类有专门用于减的方法

2.2 Instant类

记录从1970年1月1日0时0分0秒到到现在的毫秒数

1.实例化

(1)now()

(2)ofEpochMillis()方法

 2. 其他常用方法

(1)atOffset()

 (2)toEpochMilli()函数

获取从1970年到现在的毫秒数,与Date类的getTime方法一样。

 2.3 DateTimeFormatter类(相当于SimpleDateFormat)

记忆点

1. 实例化 ofPattern("")

2. 两个常用方法

        ①格式化format(): 日期LocalDateTime/LocalDate/LocalTime类------>字符串

        ②解析(格式化的逆过程)parse():字符串------>日期类

3. 不用抛异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值