JavaSE常用类日期时间01 2021.6.20-21

努力努力再努力

JDK8之前日期时间API

java.lang.System类

  • System类中的currentTimeMillis();
  • 返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差,称为时间戳
        //System类中的currentTimeMillis()
        long time = System.currentTimeMillis();
        System.out.println(time);//1624128362975
        //返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差
        //称为时间戳

Date类

java.util.Date (父类)
java.sql.Date (子类)

  • 两个构造器的使用

    1. 构造器一:Date():创建一个对应当前时间的Date对象
    2. 构造器二:创建指定毫秒数的Date对象
  • 两个方法的使用

    1. toString():显示当前的年、月、日、时、分、秒
    2. getTime():获取当前Date对象对应的毫秒数,即时间戳。
        //构造器一:Date():创建一个对应当前时间的Date对象
        Date date1 = new Date();
        System.out.println(date1.toString());//Sun Jun 20 02:54:06 GMT+08:00 2021
        System.out.println(date1.getTime());//1624128846330

        //构造器二:创建指定毫秒数的Date对象
        Date date2 = new Date(1624128346618L);
        System.out.println(date2.toString());//Sun Jun 20 02:45:46 GMT+08:00 2021

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

    1. 实例化:
        //创建java.sql.Date对象
        java.sql.Date date3 = new java.sql.Date(1550998346618L);
        System.out.println(date3.toString());//2019-02-24
  1. 如何将java.util.Date对象转换成java.sql.Date对象
        //情况一:
        Date date4 = new java.sql.Date(1550988346618L);//多态;子类对象指向父类
        java.sql.Date date5 = (java.sql.Date)date4;//强转

        //情况二:
        Date date6 = new Date();
        java.sql.Date date7 = new java.sql.Date(date6.getTime());
        System.out.println(date7.toString());//2021-06-20

SimpleDateFormat类的使用

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

  • 格式化:日期 --> 字符串
  • 解析:格式化的逆过程,字符串 --> 日期
        //不是静态的类,所以要创建对象
        SimpleDateFormat sdf = new SimpleDateFormat();//使用默认的构造器
        
        Date date = new Date();
        System.out.println(date);//Tue Jun 22 14:05:37 GMT+08:00 2021
        
        //格式化:日期 --> 字符串
        String format = sdf.format(date);
        System.out.println(format);//21-6-22 下午2:05

        //解析:格式化的逆过程,字符串 --> 日期
        String str="19-2-24 下午11:05";
        Date date1 = sdf.parse(str);//不按照格式会抛出异常ParseException
        System.out.println(date1);

按照指定的方式 格式化和解析:调用带参的构造器
在这里插入图片描述

  • 这些A——Z,a——z这些字母(不被单引号包围的)会被特殊处理替换为对应的日期时间,其他的字符串还是原样输出。日期和时间模式(注意大小写,代表的含义是不同的)

yyyy:年
MM:月
dd:日
hh:1~12小时制(1-12)
HH:24小时制(0-23)
mm:分
ss:秒
S:毫秒
E:星期几
D:一年中的第几天
F:一月中的第几个星期(会把这个月总共过的天数除以7)
w:一年中的第几个星期
W:一月中的第几星期(会根据实际情况来算)
a:上下午标识
k:和HH差不多,表示一天24小时制(1-24)。
K:和hh差不多,表示一天12小时制(0-11)。
z:表示时区

        //按照指定的方式 格式化和解析:调用带参的构造器
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date();
        
        //格式化
        String format1 = sdf1.format(date);
        System.out.println(format1);
        
        //解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),否则跑异常
        Date date2 = sdf1.parse("2021-06-22 14:52:09");
        System.out.println(date2);
练习

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

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Date date = sdf.parse("2020-09-08");
        //System.out.println(date);Tue Sep 08 00:00:00 GMT+08:00 2020

        long time = date.getTime();
        System.out.println(time);//1599494400000

        java.sql.Date date1=new java.sql.Date(time);
        System.out.println(date1);//2020-09-08

二、三天打鱼两天晒网:1990-01-01 在某一天打渔还是晒网

求总天数:举例:2019-02-24

总天数%5 == 1,2,3:打渔

总天数%5 == 4,0:晒网

总天数计算?
一、(date.getTime()-date1.getTime())/(1000 * 60 * 60 * 24)+1
二、1990-01-01 -->2018-12-31 + 2019-01-01 --> 2019-02-24

  • 方式一
    public static void main(String[] args) throws ParseException {
        String date1 = "1990-1-1";
        String date2 = "2019-02-24";

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date d1 = sdf.parse(date1);
        Date d2 = sdf.parse(date2);
        System.out.println(d1);
        System.out.println(d2);

        long time = d2.getTime() - d1.getTime();
        int day = (int) (time/1000/3600/24) + 1;
        System.out.println("第"+day+"天");

        if(day%5==4 || day%5==0) {
            System.out.println("在晒网");
        }
        else {
            System.out.println("在打鱼");
        }
    }
  • 方式二
package com.dateTime;
import java.util.*;
import java.util.regex.Pattern;

public class TestDemo02 {

        //将闰、平年的每月天数写入静态数组,并在最后加上一年的总数
        static int[] leapYear= {31,29,31,30,31,30,31,31,30,31,30,31,366};
        static int[] commonYear= {31,28,31,30,31,30,31,31,30,31,30,31,365};

         // 判断日期格式是否正确,并判断输入日期是否符合现实

        void dateJudge(String d) throws Exception{
            //判断输入日期格式是否异常
            if(!Pattern.matches("\\d{4}-\\d{2}-\\d{2}", d)) {
                throw new Exception("输入日期格式错误!");
            }
            //将日期分割,各部分构成字符串数组a
            String [] a=d.split("-");
            //将数组元素转为int型,依次赋给year,month,day三个变量
            int year=Integer.parseInt(a[0]);
            int month=Integer.parseInt(a[1]);
            int day=Integer.parseInt(a[2]);
            //判断年月日的数字是否合理
            if(year<1990) {
                throw new Exception("输入年份早于2010年!");
            }
            if(month<1||month>12) {
                throw new Exception("输入月份不在1~12范围!");
            }
            if((year%4==0&&year%100!=0)||year%400==0) {
                if(day<0||day>leapYear[month-1]) {
                    throw new Exception("输入天数不符合当月天数范围!");
                }
            }else {
                if(day<0||day>commonYear[month-1]) {
                    throw new Exception("输入天数不符合当月天数范围!");
                }
            }
        }

         // 计算从1990年10月1日到指定日期的总天数

        int dayTotal(String d) {
            //接收日期判断时出现的错误并做出处理
            try {
                dateJudge(d);
            }catch (Exception e) {
                e.printStackTrace();
                return -1;
            }
            int totalday=0;
            int startYear=1990;
            //分割日期字符串,并将数字部分解析成int型供后方计算
            String[] a=d.split("-");
            int year=Integer.parseInt(a[0]);
            int month=Integer.parseInt(a[1]);
            int day=Integer.parseInt(a[2]);
            //计算1990年1月1日到指定日期前一年的总天数
            for(int i=startYear;i<year;i++) {
                if((i%4==0&&i%100!=0)||i%400==0) {
                    totalday=totalday+leapYear[12];
                }else {
                    totalday=totalday+commonYear[12];
                }
            }
            //计算1990年1月1日到指定日期前一月的总天数
            if((year%4==0&&year%100!=0)||year%400==0) {
                for(int i=0;i<month-1;i++) {
                    totalday=totalday+leapYear[i];
                }
            }else {
                for(int i=0;i<month-1;i++) {
                    totalday=totalday+commonYear[i];
                }
            }
            //计算1990年1月1日到指定日期的总天数
            totalday=totalday+day;
            return totalday;
        }


          //主方法,具体判断这天距离1990年1月1日天数,
          //并做出“打鱼”还是“晒网”的判断


        public static void main(String[] args) {
            System.out.println("请输入查询日期(格式范例:2020-02-27):");
            Scanner s=new Scanner(System.in);
            String d=s.next();
            TestDemo02 f=new TestDemo02();
            int day=f.dayTotal(d);
            //判断指定日期是在打鱼还是晒网
            if(day!=-1) {
                System.out.println("从1990年1月1日开始第"+day+"天了");
                if(day%5==1||day%5==2||day%5==3) {
                    System.out.println("这天在打鱼!");
                }else {
                    System.out.println("这天在晒网!");
                }
            }

        }
}

Calendar日历类(抽象类)的使用

实例化:

  • 方式一:创建其子类(GregorianCalendar)的对象
  • 方式二:调用其静态方法getInstacne()
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar.getClass());//calendar对象是GregorianCalendar的对象

常用方法

        //get()
        int days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);//22
        System.out.println(calendar.get(Calendar.DAY_OF_YEAR));//173

        //set()
        calendar.set(Calendar.DAY_OF_MONTH,24);//calendar可变,set对其本身修改
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//24

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

        //getTime():日历类 ---> Date
        Date date = calendar.getTime();
        System.out.println(date);//Thu Jun 24 16:51:37 GMT+08:00 202

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

注意:

  • 获取月份时:一月是0,二月是1,以此类推,12月是11
  • 获取星期时:周日是1,周一是2,。。。周六是7
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值