不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2023-04-06 14:06:46  修改时间:2024-05-01 19:58:44  分类:Java基础  编辑

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类对象信息的获得

月份的正常值范围为0-11,0表示一月,以此类推。星期是从星期天开始计算,星期天为1,以此类推。日期的正常值范围为1-31,结尾数字视月份而定。

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类常用方法

和“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();
}

 

 

摘自:

  1. Java中的时间日期类(Calendar、Date)
  2. Java中常用的Date类与Calendar类
  3. Java时间日期的处理:Java Date类、Calendar类详解(计算 某方法/块 的执行的时间,输出 日历面板)
  4. Java 的Date和Calendar
  5. Java Date 和 Calendar类 万字详解(通俗易懂)
  6. Java中的日期时间类详解(Date、DateFormat、Calendar)
  7. Java的Date类与Calendar类
  8. [菜鸟教程]Java 日期时间 Date 和 Calendar类