进来看看Java中日期的API?

在这里插入图片描述## JDK8之前日期时间 API

  • java.lang.System类
 //1.System类中的currentTimeMillis()
    @Test
    public void test1(){
        long time = System.currentTimeMillis();
        //返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
        //称为时间戳 当前时间2020-3-10,21:25
        System.out.println(time);//1583846666636 毫秒数
    }
  • java.util.Date 类

  • java.sql.Date类数据库date类

    1.两个构造器的使用
    >构造器一:Date():创建一个对应当前时间的Date对象
    >构造器二:创建指定毫秒数的Date对象
    2.两个常用方法的使用
    >toString():显示当前的年、月、日、时、分、秒
    >getTime():获取当前Date对象对应的毫秒数。(时间戳)
    3. java.sql.Date对应着数据库中的日期类型的变量
    >如何实例化
    >如何将java.util.Date对象转换为java.sql.Date对象

public class DateTimeTest {
     @Test
    public void test2(){
        //构造器一:Date():创建一个对应当前时间的Date对象
        Date date1 = new Date();
        //显示当前的年、月、日、时、分、秒
        System.out.println(date1.toString());//Tue Mar 10 21:28:52 CST 2020 
        System.out.println(date1.getTime());//1550306204104获取时间戳

        //构造器二:创建指定毫秒数的Date对象
        Date date2 = new Date(155030620410L);
        System.out.println(date2.toString());//Sat Nov 30 16:03:40 CST 1974

        //创建java.sql.Date对象
        java.sql.Date date3 = new java.sql.Date(35235325345L);
        System.out.println(date3);//1971-02-13

        //如何将java.util.Date对象转换为java.sql.Date对象
        //情况一:
//        Date date4 = new java.sql.Date(2343243242323L);
//        java.sql.Date date5 = (java.sql.Date) date4;
        //情况二:
        Date date6 = new Date();
        java.sql.Date date7 = new java.sql.Date(date6.getTime());


    }
  • java.text.SimpleDateFormat类
    1.这是一个不与语言环境有关的方式来格式化和解析日期的具体类 。
    2.它允许 进行 格式化:日期 --> 文本 、 解析:文本 --> 日期
    关于SimpleDateFormat的使用:
    1.SimpleDateFormat对日期Date类的格式化和解析
 @Test
    public void testSimpleDateFormat() throws ParseException {
        //实例化SimpleDateFormat:使用默认的构造器
        SimpleDateFormat sdf = new SimpleDateFormat();

        //1.格式化:日期 --->字符串
        Date date = new Date();//使用java.util.Date下的Date实例化
        System.out.println(date);

        String format = sdf.format(date);//让日期格式化成字符串
        System.out.println(format);

        //解析:格式化的逆过程,字符串 ---> 日期
        String str = "20-03-10 下午21:43";
        Date date1 = sdf.parse(str);
        System.out.println(date1);

        //*************按照指定的方式格式化和解析:调用带参的构造器*****************
//        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//必须遵循格式
        //格式化
        String format1 = sdf1.format(date);
        System.out.println(format1);//2019-02-18 11:48:27
        //解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),
        //否则,抛异常
        Date date2 = sdf1.parse("2020-02-18 11:48:27");
        System.out.println(date2);
    }
  • java.util.Calendar 日历类
    Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。
    1.实例化:
    方式一:创建其子类(GregorianCalendar)的对象
    方式二:调用其静态方法getInstance()
@Test
    public void testCalendar() {
   	  Calendar calendar = Calendar.getInstance();

它的常用方法:

//从一个 Calendar 对象中获取 Date 对象
Date date = calendar.getTime;
//使用给定的 Date 设置此 Calendar 的时间
date = new Date(234234235235L);
calendar.setTime(date);
calendar.set( Calendar.CDAY_OF_MONTH,8);
System.out.println("当前时间日设置为8后,时间是:" + calendar.getTime());
calendar.add( Calendar.HOUR,2);//要是相减把2换成-2就好
System.out.println("当前时间加2小时后,时间是:" + calendar.getTime());

JDK1.8新时间API的出现:

JDK 1.0 中包含了一个 java.util.Date 类,但是它的大多数方法已经在 JDK 1.1 引入 Calendar 类之后被弃用了。而 Calendar 并不比 Date 好多少。
它们面临的问题是:
1.可变性:像日期和时间这样的类应该是不可变的。
2.偏移性:Date 中的年份是从 1900 开始的,而月份都从 0 开始。
3.格式化:格式化只对Date 有用, Calendar 则不行。
此外,它们也不是线程安全的;不能处理闰秒等。
总结:总结:对日期和时间的操作一直是Java 程序员最痛苦的地方之一。

新时间API:

  • 第三次引入的 API 是成功的, 并且 Java 8 中引入的 java.time API 已经纠正了过去的缺陷,将来很长一段时间内它都会为我们服务。
  • Java 8 吸收了 Joda Time 的精华,以一个新的开始为 Java 创建优秀的 API 。新的 java.time 中包含了所有关于 本地日期( LocalDate )、本地时间LocalTime )、本地日期时间 LocalDateTime )、时区 ZonedDateTime和持续时间( Duration )的类 。历史悠久的 Date 类新增了 toInstant() 方法,用于把 Date 转换成新的表示形式。这些新增的本地化时间日期 API 大大简化了日期时间和本地化的管理。

其中比较重要的三个类

LocalDate 、 LocalTime 、 LocalDateTime,它们的实例化时不可变的对象
两个常使用的方法:

//!now():获取当前的日期、时间、日期+时间
  LocalDate localDate = LocalDate.now();//获取当前年月日
  LocalTime localTime = LocalTime.now();//获取当前时间
  LocalDateTime localDateTime = LocalDateTime.now();//获取当前年月日与时间
//!of():设置指定的年、月、日、时、分、秒。没有偏移量 而
LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 6, 13, 23, 43);
 System.out.println(localDateTime1);//2020-03-10
 //在java.util.Date下已过时的构造器时有偏移量的
 Date date1 = new Date(2020 - 1900, 9 - 1, 8);
 System.out.println(date1);//Tue Sep 08 00:00:00 GMT+08:00 2020

还有其他方法如下:
在这里插入图片描述

  • java.time.format.DateTimeFormatter类
    *jdk1.8后格式化与解析日期或时间的类,类似于SimpleDateFormat
@Test
    public void test3() {
//        方式一:预定义的标准格式。如: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);//2020-03-10T22:08:38.437

        //解析:字符串 -->日期
        TemporalAccessor parse = formatter.parse("2020-03-10T22:08:38.437");
        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);//2020年3月10日 下午10时09分13秒


//      本地化相关的格式。如: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);//2020-3-10


//       重点: 方式三:自定义的格式。如: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);//2020-03-10 10:09:13

        //解析 字符串转日期时间
        TemporalAccessor accessor = formatter3.parse("2020-03-10 10:09:13");
        System.out.println(accessor);

    }

还有一些其他API也可以了解一下

在这里插入图片描述

总结来说:

  • 在JDK8.0后的JDK给程序员们有了一个更好的时间API,在此之前是一个头大的问题!
    在这里插入图片描述
发布了12 篇原创文章 · 获赞 39 · 访问量 641

猜你喜欢

转载自blog.csdn.net/weixin_46146269/article/details/104782453