Java中日期、时间类处理

前言: 不断向上成长,你就会活成一道光,谁接近你就是接近光

大家好我是擦擦屁屁闻闻手,一个有味道的公众号,让大家久等了,搞了个人博客,由于也是第一次各种百度,皇天不负有心人,还真给我倒腾出来了,只是有点简约,大家可以去看看,博客地址搭建过程以后整理整理发出来,毕竟知识还得衔接上,闲话少叙,开始我们今天的知识

jdk8之前
  • Date类
  1. 概述: java.util.Date 类 表示特定的瞬间,精确到毫秒.
  2. 查阅API文档,发现Date拥有多个构造函数,只是部分已经过时,但是其中有未过时的构造函数可以把毫秒值转成日期对象
  • public Date() :分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
  • public Date(long date) :分配Date对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)以来的指定毫秒数。

由于我们处于东八区,所以我们的基准时间为1970年1月1日8时0分0秒

简单来说:使用无参构造,可以自动设置当前系统时间的毫秒值;指定long类型的构造参数,可以自定义毫秒值时刻.

案例:

public class Test {
  
    public static void main(String[] args) {
        Date date=new Date();
        System.out.println(date);
        System.out.println(new Date(0L));
    }
}
Tue May 19 12:46:27 CST 2020
Thu Jan 01 08:00:00 CST 1970

在使用println方法时,会自动调用Date类中的toString方法。Date类对Object类中的toString方法进行了覆盖重写,所以结果为指定格式的字符串。

常用方法就一个:public long getTime() 把日期对象转换成对应的时间毫秒值。

可以替换成Systemle类的静态方法 static long currentTimeMillis()
、返回当前时间(以毫秒为单位)

案例:

public class Test {

    public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date.getTime());
        System.out.println(System.currentTimeMillis());
    }
}
1589864504965
1589864504965
  • DateFormat类
  1. 概述:java.text.DateFormat 是日期/时间格式化子类的 抽象类 ,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换

    • 格式化:按照指定的格式,从Date对象转换为String对象。
    • 解析:按照指定的格式,从String对象转换为Date对象。
  2. 构造方法:由于DateFormat为抽象类,不能直接使用,所以需要常用的子类java.text.SimpleDateFormat。这个类需要一个模式(格式)来指定格式化或解析的标准。构造方法为:

public SimpleDateFormat(String pattern):用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat,参数pattern是一个字符串,代表日期时间的自定义格式。

  1. 格式规则:
标识字母(区分大小写)含义
y
M
d
H
m
s

案例:

public class Test {
    
    public static void main(String[] args) {
       Date date = new Date();
        System.out.println("---------格式化前---------");
        System.out.println(date);
        System.out.println("---------格式化后---------");
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(format.format(date));
    }
}
---------格式化前---------
Tue May 19 13:17:51 CST 2020
---------格式化后---------
2020-05-19 13:17:51
  1. 常用方法:
    • public String format(Date date) :将 Date对象 格式化字符串
    • public Date parse(String source) :将 字符串解析Date对象

format方法案例同上
parse方法

public class Test {
   
    public static void main(String[] args) throws ParseException {
        DateFormat df = new SimpleDateFormat("yyyy年MM月dd日");
        String str = "2018年12月11日";
        Date date = df.parse(str);
        System.out.println(date);
    }
}
Tue Dec 11 00:00:00 CST 2018

此出告诉我们调用parse方法有可能会抛出异常,我们可以选择捕获处理也可以选择继续声明出去,在此出我们统一选择声明出去,选择Add

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ZjwEfbu-1589973304332)(https://img.duanyujia.com/wenzhang/20200519132631.jpg)]

  • Calendar类

日历我们都见过也就长这样
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4V83WDDd-1589973304335)(https://img.duanyujia.com/wenzhang/20200520091702.jpg)]

  1. 概述:java.util.Calendar是日历类,在Date后出现,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。日历类就是方便获取各个时间属性的。
    • 获取方式:Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,返回子类对象,如下

      public static Calendar getInstance() :使用默认时区和语言环境获得一个日历

案例:

public class Test {

    public static void main(String[] args) throws ParseException {
        Calendar calendar = Calendar.getInstance();
    }
}
  1. 常用方法:
  • public int get(int field) :返回给定日历字段的值。
  • public void set(int field, int value) :将给定的日历字段设置为给定值。
  • public abstract void add(int field, int amount) :根据日历的规则,为给定的日历字段添加或减去指
    定的时间量。
  • public Date getTime() :返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。
  • Calendar类中提供很多成员常量,代表给定的日历字段:
字段值含义
YEAR
MONTH月(从0开始,需要+1使用)
DAY_OF_MONTH月中的天(几号)
HOUR时(12小时制)
HOUR_OF_DAY时(24小时制)
MINUTE
SECOND
DAY_OF_WEEK周中的天(周几,周日为1,需要-1使用)
  • get/set方法:get方法用来获取指定字段的值,set方法用来设置指定字段的值

案例:

  1. get方法
public class Test {
    
    public static void main(String[] args) {
        // 创建Calendar对象
        Calendar cal = Calendar.getInstance();
        // 获取年
        int year = cal.get(Calendar.YEAR);
        // 获取月
        int month = cal.get(Calendar.MONTH) + 1;
        // 获取日
        int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        System.out.print(year + "年" + month + "月" + dayOfMonth + "日");
    }
}
2020520
  1. set方法
public class Test {
    
    public static void main(String[] args) {
        // 创建Calendar对象
        Calendar cal = Calendar.getInstance();
        //先设置年
        cal.set(Calendar.YEAR,2021);
        // 获取年
        int year = cal.get(Calendar.YEAR);
        // 获取月
        int month = cal.get(Calendar.MONTH) + 1;
        // 获取日
        int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        System.out.print(year + "年" + month + "月" + dayOfMonth + "日");
    }
2021520
  1. add方法:add方法可以对指定日历字段的值进行加减操作,如果第二个参数为正数则加上偏移量,如果为负数则减去偏移量
public class Test {
  
    public static void main(String[] args) {
        // 创建Calendar对象
        Calendar cal = Calendar.getInstance();
        // 获取年
        int year = cal.get(Calendar.YEAR);
        // 获取月
        int month = cal.get(Calendar.MONTH) + 1;
        // 获取日
        int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        System.out.println("---------未使用add方法前-----------");
        System.out.println(year + "年" + month + "月" + dayOfMonth + "日");
         // 使用add方法
        cal.add(Calendar.DAY_OF_MONTH, 2); // 加2天
        cal.add(Calendar.YEAR,-3); // 减3年
        // 获取年
        year = cal.get(Calendar.YEAR);
        // 获取月
         month = cal.get(Calendar.MONTH) + 1;
        // 获取日
         dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        System.out.println("---------使用add方法后-----------");
        System.out.println(year + "年" + month + "月" + dayOfMonth + "日");
    }
}
---------未使用add方法前-----------
2020520---------使用add方法后-----------
2017522
  1. getTime方法:Calendar中的getTime方法并不是获取毫秒时刻,而是拿到对应的Date对象
public class Test {
  
    public static void main(String[] args) {
        // 创建Calendar对象
        Calendar cal = Calendar.getInstance();
        Date date = cal.getTime();
        System.out.println(date);
    }
}
Wed May 20 09:47:15 CST 2020

西方星期的开始为周日,中国为周一。在Calendar类中,月份的表示是以0-11代表1-12月。日期是有大小关系的,时间靠后,时间越大

jdk8之后

jdk8之前的日期处理:

  1. java的java.util.Date和java.util.Calendar类易用性差,不支持时区,并且是可变的,也就意味着他们都不是线程安全的;
  2. 用于格式化日期的类DateFormat被放在java.text包中,它是一个抽象类,所以我们需要实例化一个SimpleDateFormat对象来处理日期格式化,并且DateFormat也是非线程安全,这意味着如果你在多线程程序中调用同一个DateFormat对象,会得到意想不到的结果。
  3. 对日期的计算方式繁琐,而且容易出错,因为月份是从0开始的,这意味着从Calendar中获取的月份需要加一才能表示当前月份

jdk8之后的日期处理:

  1. Java 8的日期和时间类包含LocalDate、LocalTime、Instant、Duration以及Period,这些类都包含在java.time包中。
  2. 增加和减少日期
  3. 格式化日期,旧的格式化日期以及SimpleDateFormat非线程安全使其应用非常受限,新的日期API中提供了一个DateTimeFormatter类用于处理日期格式化操作,它被包含在java.time.format包中,Java 8的日期类有一个format()方法用于将日期格式化为字符串,该方法接收一个DateTimeFormatter类型参数:
  4. 时区,Java 8中的时区操作被很大程度上简化了,新的时区类java.time.ZoneId是原有的java.util.TimeZone类的替代品。ZoneId对象可以通过ZoneId.of()方法创建,也可以通过ZoneId.systemDefault()获取系统默认时区

新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。

编号类名称描述
1Instant时间戳
2Duration持续时间,时间差
3LocalDate只包含日期,比如:2020-05-20
4LocalTime只包含时间,比如:23:12:10
5LocalDateTime包含日期和时间,比如:2020-05-20 23:12:10
6Period时间段
7java.time.format.DateTimeFormatter时间格式化
LocalDate类
  1. LocalDate获取年、月、日、周:
  • public int getYear() 获取当前年份
  • public Month getMonth() 获取当前月份的枚举类型
  • public int getMonthValue() 获取当前月份的值1到12
  • public int getDayOfMonth()获取几号字段
  • public DayofWeek getDayOfWeek()获取星期几字段的枚举类型,再.getgetValue()拿到数字星期几
  • public int getDayOfYear() 获取当前日期当前年第几天
public class Test {
    
    LocalDate localDate = LocalDate.now();
        System.out.println("今天的日期:"+localDate);
        System.out.println("获取年份:"+localDate.getYear());
        System.out.println("获取月份的枚举类型:"+localDate.getMonth());
        System.out.println("获取月份:"+localDate.getMonthValue());
        System.out.println("获取今天几号:"+localDate.getDayOfMonth());
        System.out.println("今天周中的第几天(周几)的枚举类型::"+localDate.getDayOfWeek());
        System.out.println("今天是周:"+localDate.getDayOfWeek().getValue());
        System.out.println("今天是"+localDate.getYear()+"年的第:"+localDate.getDayOfYear()+"天");
    }    
}
今天的日期:2020-05-20
获取年份:2020
获取月份的枚举类型:MAY
获取月份:5
获取今天几号:20
今天周中的第几天(周几)的枚举类型::WEDNESDAY
今天是周:3
今天是2020年的第:141
  1. LocalDate计算未来的年、月、日、周:
public class Test {
    
    public static void main(String[] args) {
        LocalDate localDate = LocalDate.now();
        System.out.println("两年后的日期:"+localDate.plusYears(2));
        System.out.println("两月后的日期:"+localDate.plusMonths(2));
        System.out.println("两天后日期:"+localDate.plusDays(2));
        System.out.println("两周后日期:"+localDate.plusWeeks(2));
    }
}
两年后的日期:2022-05-20
两月后的日期:2020-07-20
两天后日期:2020-05-22
两周后日期:2020-06-03
LocalTime
  1. LocalTime,获取当前系统时间、时、分、秒,精确到纳秒,不包含日期
public class Test {
   
    public static void main(String[] args) {
        LocalTime localTime = LocalTime.now();
        System.out.println("当前系统时间为:"+localTime);
        System.out.println("当前系统时间的时:"+localTime.getHour());
        System.out.println("当前系统时间的分:"+localTime.getMinute());
        System.out.println("当前系统时间的秒:"+localTime.getSecond());
        System.out.println("当前系统时间的纳秒:"+localTime.getNano());
    }
}
当前系统时间为:16:08:27.142
当前系统时间的时:16
当前系统时间的分:8
当前系统时间的秒:27
当前系统时间的秒:142000000
  1. LocalTime,计算未来的系统时间的时、分、秒,精确到纳秒,不包含日期
public class Test {
   
    public static void main(String[] args) {
        LocalTime localTime = LocalTime.now();
        System.out.println("当前系统时间:"+localTime);
        System.out.println("获取两小时后的时间" + localTime.plusHours(2));
        System.out.println("获取两分之后的时间" + localTime.plusMinutes(2));
        System.out.println("获取两秒后的时间" + localTime.plusSeconds(2));
    }
}
当前系统时间:16:16:39.695
获取两小时后的时间18:16:39.695
获取两分后的时间16:18:39.695
获取两秒后的时间16:16:41.695
public class Test {
   
    public static void main(String[] args) {
        LocalTime localTime = LocalTime.now();
        System.out.println("当前系统时间:"+localTime);
        System.out.println("获取两小时前的时间" + localTime.minusHours(2));
        System.out.println("获取两分前的时间" + localTime.plusMinutes(2));
        System.out.println("获取两秒前的时间" + localTime.plusSeconds(2));
    }
}
当前系统时间:16:22:30.041
获取两小时前的时间14:22:30.041
获取两分前的时间16:24:30.041
获取两秒前的时间16:22:32.041
LocalDateTime

LocalDateTime:见名知意, 获取系统的日期+时间,其实就是兼容了LocalDate和LocalTime的某些方法,再加上自身的一些方法

public class Test {
  
    public static void main(String[] args) {
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println("当前系统的日期加时间:" + localDateTime);
        System.out.println("当前系统的年:" + localDateTime.getYear());
        System.out.println("当前系统的月:" + localDateTime.getMonthValue());
        System.out.println("当前系统的日:" + localDateTime.getDayOfMonth());
        System.out.println("当前系统的时:" + localDateTime.getHour());
        System.out.println("当前系统的分:" + localDateTime.getMinute());
        System.out.println("当前系统的秒:" + localDateTime.getSecond());
    }
}
当前系统的日期加时间:2020-05-20T16:45:46.343
当前系统的年:2020
当前系统的月:5
当前系统的日:20
当前系统的时:16
当前系统的分:45
当前系统的秒:46
Duration

Duration一般用来时间间隔的处理

public class Test {
  
    public static void main(String[] args) throws InterruptedException {
        Instant inst1 = Instant.now();
        System.out.println("当前时间 : " + inst1);
        //设置秒数加10
        Instant inst2 = inst1.plus(Duration.ofSeconds(10));
        System.out.println("十秒后的时间 : " + inst2);
        //相差秒数转换为毫秒
        System.out.println("两个时间相差毫秒数: " + Duration.between(inst1, inst2).toMillis());
        //相差秒数
        System.out.println("两个时间相差秒数:: " + Duration.between(inst1, inst2).getSeconds());

    }
当前时间 : 2020-05-20T09:39:45.470Z
十秒后的时间 : 2020-05-20T09:39:55.470Z
两个时间相差毫秒数: 10000
两个时间相差秒数:: 10
Period

Period类主要是Period类方法getYears(),getMonths()和getDays()来计算.

public class Test {
  
    public static void main(String[] args) throws InterruptedException {
        LocalDate today = LocalDate.now();
        System.out.println("当前日期 : " + today);
        //指定年月日设置日期
        LocalDate birthDate = LocalDate.of(1993, Month.OCTOBER, 19);
        System.out.println("设置后的日期 : " + birthDate);

        Period p = Period.between(birthDate, today);
        System.out.println("相差"+ p.getYears()+"年"+ p.getMonths()+"个月" +p.getDays()+"天");

    }
}
当前日期 : 2020-05-20
设置后的日期 : 1993-10-19
相差267个月1
DateTimeFormatter

DateTimeFormatter类用于将字符串解析为日期对象

  • static ofPattern(String pattern):静态方法,根据指定的字符串设定的格式,将返回一个DateTimeFormatter对象。
  • LocalDateTime.parse(strDate,formatter);静态方法,此方法将指定的字符串strDate,按DateTimeFormatter对象的字符串格式解析为一个LocalDateTime对象。
  • format(formatter):此方法属于LocalDateTime类的方法。用于将LocalDateTime对象按照DateTimeFormatter指定的格式,转换为一个字符串对象。
public class Test {

    public static void main(String[] args) throws InterruptedException {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        //将字符串按照DateTimeFormatter对象指定的格式解析为LocalDateTime对象
        LocalDateTime date = LocalDateTime.parse("2018-08-18 22:30:22", formatter);
        System.out.println(date.toString());

        //将LocalDateTime对象按照DateTimeFormatter指定的格式转换为字符串输出
        formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd_HH/mm/ss");
        String str = date.format(formatter);
        System.out.println(str);
    }
}
2018-08-18T22:30:22
2018/08/18_22/30/22

其中还有Instant时区的处理、ZonedDateTimeZoneId等等,由于不常用这里就不在仔细讲了

愿景:愿程序永无Bug

本文使用mdnice排版

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值