时间和日期相关的API

java 8之前的与时间和日期相关的API

  • System类中的currentTimeMillis();
  • java.util.Date类和java.sql.Date
  • SimpleDateFormat
  • Calendar

java.lang.System类

System类提供的public static long currentTimeMillis()用来返回当前时 间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差

  1. java.util.Date类 表示特定的瞬间,精确到毫秒
    • 构造器:
      • Date():使用无参构造器创建的对象可以获取本地当前时间。
      • Date(long date) 使用指定毫秒数创建时间对象
    • 常用方法
      • getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象 表示的毫秒数。
      • toString():把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat),zzz是时间标准。
      • 其它很多方法都过时了。

java.sql.Data对应着数据库中的日期类型函数

如何把java.util.Date对象转化为java.sql.Date对象?

public static void main(String[] args) {
        Date date2 = new Date();
        long time = date2.getTime();

       java.sql.Date date1 = new java.sql.Date(time);
       System.out.println(date1);//2021-11-19

    }

java.text.SimpleDataFormat类

SimpleDateFormat对日期Date类的格式化和解析

  1. 两个操作:
    1.1 格式化:日期 —>字符串 format(date)
    1.2 解析:格式化的逆过程,字符串 —> 日期 parse(“2020-02-18 11:48:27”)

  2. SimpleDateFormat的实例化:new + 构造器

    		Date date  = new Date();//获取当前时间对象
    
    //*************照指定的方式格式化和解析:调用带参的构造器*****************
    //        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);
    

练习:

练习一:字符串"2020-09-08"转换为java.sql.Date

 @Test
    public void Test() throws ParseException {
        //练习一:字符串"2020-09-08"转换为java.sql.Date
        SimpleDateFormat sd1 = new SimpleDateFormat("yyyy-MM-dd");
        Date date = sd1.parse("2020-09-08");
//        System.out.println(date);

        java.sql.Date date1 = new java.sql.Date(date.getTime());
        System.out.println(date1);
    }

练习二:“三天打渔两天晒网” 1990-01-01 xxxx-xx-xx 打渔?晒网?

举例:2020-09-08 ? 总天数

总天数 % 5 == 1,2,3 : 打渔
总天数 % 5 == 4,0 : 晒网

总天数的计算?
方式一:( date2.getTime() - date1.getTime()) / (1000 * 60 * 60 * 24) + 1
方式二:1990-01-01  --> 2019-12-31  +  2020-01-01 -->2020-09-08
      首先算出有多少年(365天),中间可以使用闰年的逻辑加一,然后加上当前的几天

java.util.Calendar(日历)类

  • Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。
  • 获取Calendar实例的方法
  • 方式一:使用Calendar.getInstance()方法 其实这也是获取的GregorianCalendar类对象
  • 方式二:调用它的子类GregorianCalendar的构造器。
  • 一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想 要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、 MINUTE、SECOND
  • public void set(int field,int value)
  • public void add(int field,int amount)
  • public final Date getTime()
  • public final void setTime(Date date)
  • 注意:
  • 获取月份时:一月是0,二月是1,以此类推,12月是11
  • 获取星期时:周日是1,周二是2 , 。。。。周六是7
		//1.实例化
        //方式一:创建其子类(GregorianCalendar的对象
        //方式二:调用其静态方法getInstance()
        Calendar calendar = Calendar.getInstance();
//        System.out.println(calendar.getClass());

        //2.常用方法
        //get()
        int days = calendar.get(Calendar.DAY_OF_MONTH);//今天是这一个月的第几天
        System.out.println(days);
        System.out.println(calendar.get(Calendar.DAY_OF_YEAR));//今天是这一年的第几天

        //set()
        //calendar可变性
         calendar.set(Calendar.DAY_OF_MONTH,22);
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);//22

        //add()
        calendar.add(Calendar.DAY_OF_MONTH,-3);
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);

        //getTime():日历类---> Date
        Date date = calendar.getTime();
        System.out.println(date);

        //setTime():Date ---> 日历类
        Date date1 = new Date();
        calendar.setTime(date1);
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);

## JDK 8中的新的日期时间API

LocalDate、LocalTime、LocalDateTime 类

  1. 日期时间API的迭代:

第一代:jdk 1.0 Date类

第二代:jdk 1.1 Calendar类,一定程度上替换Date类

第三代:jdk 1.8 提出了新的一套API

  1. Calendar并不比Date好多少,它们面临的问题是:
  • 可变性:像日期和时间这样的类应该是不可变的。
  • 偏移性:Date中的年份是从1900开始的,而月份都从0开始。
  • 格式化:格式化只对Date有用,Calendar则不行。
  • 此外,它们也不是线程安全的;不能处理闰秒等。

LocalDate、LocalTime、LocalDateTime 类是其中较重要的几个类,它们的实例 是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。 它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区 相关的信息

  • LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期。
  • LocalTime表示一个时间,而不是日期。
  • LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一

image-20211121135847503

时间点:Instant

java.time包通过值类型Instant提供机器视图,不提供处理人类意义上的时间 单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。 概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒 数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。

(1 ns = 10-9 s) 1秒 = 1000毫秒 =106微秒=109纳秒

image-20211121144541500

​ 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01 日08时00分00秒)起至现在的总秒数。

java.time.format.DateTimeFormatter 类:

该类提供了三种格式化方法:

  • 预定义的标准格式。如: ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME

  • 本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)

  • 自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

    image-20211121150622897

    特别的:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

//  重点:自定义的格式。如: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);

其他API

  • ZoneId:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris
  • ZonedDateTime:一个在ISO-8601日历系统时区的日期时间,如 2007-12- 03T10:15:30+01:00 Europe/Paris。
    • 其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式,例如: Asia/Shanghai等
  • Clock:使用时区提供对当前即时、日期和时间的访问的时钟。
  • 持续时间:Duration,用于计算两个“时间”间隔
  • 日期间隔:Period,用于计算两个“日期”间隔
  • TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整 到“下一个工作日”等操作。
  • TemporalAdjusters : 该类通过静态方法 (firstDayOfXxx()/lastDayOfXxx()/nextXxx())提
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值