Java时间API

Java时间API

1. JDK8之前的时间API

1.1 System.currentTimeMillis()

返回的是1970年0时0分到现在的毫秒数(long类型的数据),又称为时间戳
这个方法适用于计算时间差

@Test
public void test1(){
    //返回的是1970年0时0分到现在的毫秒数,称为时间戳
    long time = System.currentTimeMillis();
    System.out.println(time);
}

1.2 Date类

有2个Data类,java.util.Date类和java.sql.Date类
java.util.Date类是java.sql.Date类的父类

java.util.Date类
  1. 2个构造器
  • 空参构造器:Date date1 = new Date();创建了一个对应当前时间的Date对象
  • 带参构造器:Date date2 = new Date(12355353242L);创建指定毫秒数的Date对象
  1. 两个常用方法
  • toString():显示当前的年月日、时分秒
  • getTime():返回long类型的时间戳(和System.currentTimeMillis()的效果是一样的)
java.sql.Date类

java.sql.Date类对应数据库中的日期类型的变量

java.sql.Date date = new java.sql.Date(1233332223242L);
System.out.println(date);   //2009-01-31
  • 如何将java.sql.Date的对象转化为java.util.Date的对象?
    多态,直接赋值即可。因为java.sql.Date是子类
  • 如何将java.util.Date的对象转化为java.sql.Date的对象?
      Date date = new Date();
      java.sql.Date date2 = new java.sql.Date(date.getTime());
    

1.3 java.text.SimpleDateFormat类

  1. 格式化
    格式化:将日期转化为字符串
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat();
String str = sdf.format(date);
System.out.println(str);    //默认格式是这样的:2023/1/5 上午11:15
  1. 解析
    解析:将字符串转化为日期,解析的字符串要按照SimpleDateFormat对象格式化的格式来才可以解析,否则会抛异常(格式通过构造器来体现)
//解析:将字符串转化为日期
String str = "2022/12/1 上午11:15";
Date date2 = sdf.parse(str);
System.out.println(str);
System.out.println(date2);

调用带参数的构造器指定日期格式
上面构造SimpleDateFormat的对象是空参构造器,适用的日期格式是默认的,实际使用中我们可以指定日期的格式

Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String str = sdf.format(date);
System.out.println(str);    //2023-01-05 11:28:12
Date date2 = sdf.parse("2023-01-05 11:28:12");

1.4 java.util.Calendar类

Calender是一个抽象类

实例化的2种方式
  • 方式一:调用静态方法getInstance()
  • 方式二:创建子类GregorianCalendar的对象
    通常采用第一种方式Calendar = getInstance()
Calendar calendar = Calendar.getInstance();
常用方法
  1. get()
    获取当前日期是月份中的第几天,一年中的第几天

    System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
    System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
    
  2. void set()
    因为set方法没有返回值(void),所以是将当前日期本身进行修改

     calendar.set(2022,12,20);
     System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
    
  3. void add()
    针对对象的指定属性进行加法(负数表示减法)运算

    //在当前日期的基础上,减去3天
     calendar.add(Calendar.DAY_OF_MONTH,-3);
    
  4. Date getTime()
    将Calendar类转化为Date类

     Date date = calendar.getTime();
     System.out.println(date);
    
  5. setTime(Date date)
    将Date类转化为Calendar类

     calendar.setTime(date);
    

注意

  • 获取月份时:一月是0,二月是1,以此类推,12月是11
  • 获取星期时:周日是1,周二是2 ··· 周六是7

JDK8之前的时间API有诸多的缺陷,所以在JDK8引入了新的时间API

为什么要引入新的时间API ?

image.png

2. JDK8新引入的时间API

2.1 LocalDate,LocalTime,LocalDateTime

LocalDateTime类使用的频率大于LocalDate,LocalTime

1. now()

now()是一个静态方法(static),可以获取当前的时间

@Test
public void test1(){
    //now():获取当前的日期、时间、日期+时间
    LocalDate localDate = LocalDate.now();
    LocalTime localTime = LocalTime.now();
    LocalDateTime localDateTime = LocalDateTime.now();

    System.out.println(localDate);//2023-01-05
    System.out.println(localTime);//17:09:44.866713100
    System.out.println(localDateTime);//2023-01-05T17:09:44.866713100

}
2. of()

使用静态方法of()指定年月日,时分秒(没有偏移量)

//LocalDate和LocalTime同理
 LocalDateTime localDateTime1 = LocalDateTime.of(2022,12,10,8,0,0);
System.out.println(localDateTime1);//2022-12-10T08:00
3. getXxx()
  • getDayOfMonth(): 得到月份天数(1-31)
  • getDayOfYear(): 得到年份天数(1-366)
  • getDayOfWeek(): 得到星期几(枚举值)
  • getMonth(): 得到月份Month的枚举值(FEBURARY)
  • getMonthValue(): 得到月份的数值
  • getYear(): 得到年份的数值
  • getHour()/getMinute():getSecond():得到时分秒
4.withXxx()
  • withDayOfMonth()/withDayOfYear()/withMonth()/withYear()
    将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象
5.plusXxx()/minusXxx()
  • plusDays(), plusWeeks(), plusMonths(), plusYears(),plusHours()
    向当前对象添加几天、几周、几个月、几年、几小时,返回新的对象
  • minusMonths() / minusWeeks()/minusDays()/minusYears()/minusHours()
    从当前对象减去几月、几周、几天、几年、几小时,返回新的对象

注意

  • 返回新的对象,体现出的是不可变性,和String的不可变性类似
  • 而Calendar中的时间是对原有的对象进行修改,不具有不可变性
    image.png

2.2 Instant类

   @Test
    public void test2(){
        //得到的是本初子午线的标准时间
        Instant instant = Instant.now();
        System.out.println(instant);//2023-01-05T12:00:08.517341300Z

        //中国处在东八区,需要在此基础上加上8个小时
        OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
        System.out.println(offsetDateTime);//2023-01-05T20:00:08.517341300+08:00

        //获取1970年0时0分到现在的毫秒数
        System.out.println(instant.toEpochMilli());

        Instant instant1 = Instant.ofEpochMilli(1672920215586L);
        System.out.println(instant1);
    }

image.png

2.3 DateTimeFormatter类

用于格式化与解析日期或时间,类似于SimpleDateFormat类

  1. 实例化
  • 方式1:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
  • 方式2:本地化相关的格式,如:ofLocalizedDateTime(FormatStyle.LONG),还可以选择FormatStyle.MEDIUM,FormatStyle.SHORT,FormatStyle.FULL等作为参数
  • 方式3:自定义的格式,如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

实际使用中主要使用自定义的格式

  1. 格式化(format)
    将日期转化为字符串

  2. 解析(parse)
    将字符串转化为日期

//        方式一:预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
        DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        //格式化:日期-->字符串
        LocalDateTime localDateTime = LocalDateTime.now();
        String str1 = formatter.format(localDateTime);
        System.out.println(localDateTime);
        System.out.println(str1);//2019-02-18T15:42:18.797

        //解析:字符串 -->日期
        TemporalAccessor parse = formatter.parse("2019-02-18T15:42:18.797");
        System.out.println(parse);

//        方式二:
//        本地化相关的格式。如:ofLocalizedDateTime()
//        FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT :适用于LocalDateTime
        DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
        //格式化
        String str2 = formatter1.format(localDateTime);
        System.out.println(str2);//2019年2月18日 下午03时47分16秒


//      本地化相关的格式。如:ofLocalizedDate()
//      FormatStyle.FULL / FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT : 适用于LocalDate
        DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
        //格式化
        String str3 = formatter2.format(LocalDate.now());
        System.out.println(str3);//2019-2-18


//       重点: 方式三:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
        DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
        //格式化
        String str4 = formatter3.format(LocalDateTime.now());
        System.out.println(str4);//2019-02-18 03:52:09

        //解析
        TemporalAccessor accessor = formatter3.parse("2019-02-18 03:52:09");
        System.out.println(accessor);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值