zoukankan      html  css  js  c++  java
  • Java中的时间日期类(Calendar、Date)

    Java中操作时间日期的类有:Date(日期)、Calendar(日历)、DateFormat(日期格式)。

    一、Date

    java.util.Date,表示特定的瞬间,精确到毫秒。

    1、构造方法

    很久以前,Date类的构造方法有:
    Date(int year, int month, int date)
    Date(int year, int month, int date, int hrs, int min)
    Date(String s)
    等等……

    然而这些方法早就过时,从JDK1.1开始,就只保留了以下两种构造方法:

    • Date()
      不用多说,new 出来的 Date 就是当前时间。

    • Date(long date)
      分配 Date 对象并初始化此对象,入参为从历元(即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。

    2、Date类常用方法

    序号 方法 描述
    1 boolean after(Date date) 若当调用此方法的Date对象在指定日期之后返回true,否则返回false
    2 boolean before(Date date) 若当调用此方法的Date对象在指定日期之前返回true,否则返回false
    3 int compareTo(Date date) 比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数
    4 boolean equals(Object date) 当调用此方法的Date对象和指定日期相等时候返回true,否则返回false
    5 long getTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数
    6 void setTime(long time) 用时间戳设置时间和日期
    7 String toString() 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)

    3、日期比较

    可以使用以下三种方法对两个日期进行比较:

    • 使用 getTime() 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值

    • 使用方法 before()after()equals()。例如,一个月的12号比18号早,则:

    new Date(99, 2, 12).before(new Date (99, 2, 18))    //返回true
    
    • 使用 compareTo() 方法,它是由 Comparable 接口定义的,Date 类实现了这个接口。

    4、使用SimpleDateFormat格式化日期

    Date date=new Date();
    System.out.println(date);   //Sun Dec 31 15:00:08 CST 2017
    
    SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    System.out.println(format.format(date));    //2017-12-31 15:00:08
    
    format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a zzz");
    System.out.println(format.format(date));    //2017-12-31 03:00:08 PM CST
    

    5、获取一个指定时间的Date对象

    可以使用CalendargetTime()方法,返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象。

    后面有讲。

    二、Calendar

    我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar类。

    java.utiI.Calendar,是一个抽象类,
    用于设置和获取日期/时间数据的特定部分。
    Calendar类提供一些方法和静态字段来操作日历。

    1、获取Calendar对象

    Calender是抽象类,所以不能被实例化,可以使用Calendar的getInstance()方法获取Calendar对象:

    Calendar calendar = Calendar.getInstance();    //默认是当前日期
    

    2、Calendar常用方法

    序号 方法 描述
    1 int get(int field) 返回给定日历字段的值,参数为常量,可以得到:年、月、日、小时、分钟、星期几
    2 void set(int year, int month, int date) 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值
    3 void set(int year, int month, int date, int hourOfDay, int minute) 设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值
    4 void set(int year, int month, int date, int hourOfDay, int minute, int second) 设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值
    5 void setTime(Date date) 使用给定的 Date 设置此 Calendar 的时间
    6 Date getTime() 返回一个表示此 Calendar 时间值的 Date 对象
    7 void add(int field, int amount) 根据日历的规则,为给定的日历字段添加或减去指定的时间量
    8 int getActualMaximum(int field) 返回当前月份的天数,参数为Calendar.DATE

    2.1 Calendar常量

    常量 描述
    Calendar.YEAR
    Calendar.MONTH
    Calendar.DAY_OF_MONTH
    Calendar.DATE 日,和Calendar.DAY_OF_MONTH完全相同
    Calendar.HOUR 小时(12小时制)
    Calendar.HOUR_OF_DAY 小时(24小时制)
    Calendar.MINUTE 分钟
    Calendar.SECOND
    Calendar.DAY_OF_WEEK 星期几

    注意:
    月+1,周-1.

    西方表示的月和我们有些不一样,第一个月用的是0表示,要获得准确的月就要+1;
    星期几的话,一周的第一天应该是星期日,因此1代表星期日、2代表星期1、3代表星期二…
    如果想将1表示为星期一的话,那么周就需要-1.

    3、Calendar类对象信息的获得

    Calendar calendar=Calendar.getInstance();
    
    int year=calendar.get(Calendar.YEAR);
    int month=calendar.get(Calendar.MONTH)+1;
    int day=calendar.get(Calendar.DAY_OF_MONTH);
    int hour=calendar.get(Calendar.HOUR_OF_DAY);
    int minute=calendar.get(Calendar.MINUTE);
    int second=calendar.get(Calendar.SECOND);
    int week=calendar.get(Calendar.DAY_OF_WEEK)-1;
    
    System.out.println("现在是:"+year+"年"+month+"月"+day+"日 "+hour+":"+minute+":"+second+" 星期"+week);
    //现在是:2017年12月31日 15:57:39 星期0
    //-1之后,0表示星期日
    

    4、给Calendar对象设置指定日期

    Calendar calendar=Calendar.getInstance();
    //设置为:2017年10月1日 22:59:59
    //在设置时间是,月要-1
    calendar.set(2017,10-1,1,22,59,59);
    

    5、使用add()方法修改时间

    //今天
    Calendar calendar=Calendar.getInstance();
    
    int year=calendar.get(Calendar.YEAR);
    int month=calendar.get(Calendar.MONTH)+1;
    int day=calendar.get(Calendar.DAY_OF_MONTH);
    int week=calendar.get(Calendar.DAY_OF_WEEK)-1;
    String[] currentDay={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
    
    System.out.println("今天是:"+year+"年"+month+"月"+day+"日 "+currentDay[week]);    //今天是:2017年12月31日 星期日
    
    //1天后
    calendar.add(Calendar.DAY_OF_MONTH,+1);     //往后推移一天
    
    year=calendar.get(Calendar.YEAR);
    month=calendar.get(Calendar.MONTH)+1;
    day=calendar.get(Calendar.DAY_OF_MONTH);
    week=calendar.get(Calendar.DAY_OF_WEEK)-1;
    System.out.println("明天是:"+year+"年"+month+"月"+day+"日 "+currentDay[week]);    //明天是:2018年1月1日 星期一
    

    6、获取当月的天数

    Calendar calendar=Calendar.getInstance();
    
    int year=calendar.get(Calendar.YEAR);
    int month=calendar.get(Calendar.MONTH)+1;
    
    System.out.println("今天是:"+year+"年"+month+"月");
    System.out.println("本月一共有"+calendar.getActualMaximum(Calendar.DAY_OF_MONTH)+"天");
    

    三、GregorianCalendar类

    Calendar类实现了公历日历,GregorianCalendar是Calendar类的一个具体实现。

    CalendargetInstance()方法,返回的就是一个默认用当前的语言环境和时区初始化的GregorianCalendar对象。

    1、GregorianCalendar类常用构造方法

    序号 方法 描述
    1 GregorianCalendar() 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar
    2 GregorianCalendar(int year, int month, int date) 创建指定日期的GregorianCalendar
    3 GregorianCalendar(int year, int month, int date, int hour, int minute) 创建指定日期的GregorianCalendar
    4 GregorianCalendar(int year, int month, int date, int hour, int minute, int second) 创建指定日期的GregorianCalendar

    2、GregorianCalendar类常用方法

    2、Calendar常用方法基本一致,毕竟是其实现类。

    但还有个特有方法:boolean isLeapYear(int year),确定给定的年份是否为闰年。

    因此不要向上转型,否则不能调用特有方法。

    3、确定当年是否为闰年

    //首先不能向上转型,这里要使用实现类GregorianCalendar作为引用
    GregorianCalendar calendar=new GregorianCalendar(2024,10-1,1);
    
    int year=calendar.get(Calendar.YEAR);
    
    boolean isLeapYear=calendar.isLeapYear(year);
    if(isLeapYear) System.out.println("当前年份是闰年");
    else System.out.println("当前年份是平年");
    

    四、Date、String、Calendar类型之间的转化

    1、Date 转 Calendar

    Calendar calendar = Calendar.getInstance();
    calendar.setTime(new Date());
    

    2、Calendar 转 Date

    Calendar calendar = Calendar.getInstance();
    Date date = calendar.getTime();
    

    3、Date 转 String

    这个没什么好说的,SimpleDateFormat格式化。

    4、String 转 Date

    使用SimpleDateFormat类的parse(String str)方法将字符串转为Date.

    String str="2010-5-27";
    SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd");
    Date date = format.parse(str);
    

    5、Calendar 转 String

    两种方法:

    • 使用Calendar.get()方法取到年月日信息,然后+"";
    • Calendar.getTime()拿到Date对象,然后SimpleDateFormat格式化。

    6、String 转 Calendar

    先使用SimpleDateFormat.parse(String str)方法将字符串转为Date类型,然后使用Calendar.setTime(Date date)方法。

    五、计算两个日期相差了多少天

    SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
    try {
        Date $start=simpleDateFormat.parse("2017-1-1");
        Date $end=simpleDateFormat.parse("2019-1-1");
    
        Calendar start=Calendar.getInstance();
        Calendar end=Calendar.getInstance();
        start.setTime($start);
        end.setTime($end);
        int day = end.get(Calendar.DAY_OF_YEAR) - start.get(Calendar.DAY_OF_YEAR);
        int resultYear=(end.get(Calendar.YEAR) - start.get(Calendar.YEAR))*365;
        int result=day+resultYear;
    
        System.out.println("相差"+result+"天");
    
    } catch (ParseException e) {
        e.printStackTrace();
    }
    
  • 相关阅读:
    harbor 报错,注意harbor.yml文件格式。
    nginx中rewrite文件
    改善github网络连接
    代码层实现六种质量属性战术
    读漫谈架构有感
    “淘宝网”的六个质量属性的六个常见属性
    寒假学习进度16:tensorflow2.0 波士顿房价预测
    寒假学习进度15:tensorflow2.0 优化器
    寒假学习进度14:对mnist数据集实现逻辑回归
    寒假学习进度13:tensorflow2.0 mnist简介
  • 原文地址:https://www.cnblogs.com/VitoYi/p/8158237.html
Copyright © 2011-2022 走看看