java 日期相关Date、SimpleDateFormat、Calendar区别与使用

本篇文章主要摘录了4篇文章的内容,原文在文末
在java中时间类主要有Date、Calendar、SimpleDateFormat,暂时只介绍 java.util.*下的时间类,对于java.sql.下的先不做介绍,文章比较长可以根据自己的需要看对应的内容。

目录:
一、Date类
1.使用Date类代表当前系统时间
2.使用Date类代表指定时间
3.获取Date对象中的信息(年月日周)
二、Calendar类
1.使用Calendar类代表当前时间
2.使用Calendar类代表指定的时间
1)指定日期中,年月日
2)指定日期年月日,中某个日期
3.Calendar类常用方法
案例:
三、SimpleDateFormat类
1.String 类型转化成Date
2.Date类型转化成为String
3.其它日期格式
四、后记

一、Date类

在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理。这里简单介绍一下Date类的使用。
Date类中很多方法已经过时,使用Calendar来替代。

常用方法有,

long getTime()   //返回的时间是距离1970年的毫秒数

void setTime(long time)
1.使用Date类代表当前系统时间
//创建一个代表系统当前日期的Date对象
Date now = new Date();
System.out.println(date);
//Wed Dec 29 15:38:51 CST 2021

使用Date类的默认构造方法创建出来的对象就代表当前的时间,由于Date类覆盖了toString()方法。所以可以直接输出Date类型的对象,显示的结果如下:Wed Dec 29 15:38:51 CST 2021

2.使用Date类代表指定时间

使用带参数的构造方法 Date(int year, int month, int day),可以构造指定日期的Date类对象,Date类中年份的参数应该是实际需要代表的年份减去1900月份参数应该是实际需要代表的月份减去1以后的值

//创建一个代表2021年6月12号的Date对象
Date d1 = new Date(2021-1900, 6-1, 12); 
3.获取Date对象中的信息(年月日周)
如:
Date d2 =  new Date(2014-1900, 6-1, 12);

 //获得年份 (注意年份要加上1900,这样才是日期对象d2所代表的年份)
int year = d2.getYear() + 1900;
//获得月份  (注意月份要加1,这样才是日期对象d2所代表的月份)
int month = d2.getMonth() + 1;
//获得日期
int date = d2.getDate();

//获得小时
int hour = d2.getHours();//不设置默认为0
//获得分钟
int minute = d2.getMinutes();
//获得秒
int second = d2.getSeconds();

 //获得星期 (注意:0代表星期日、1代表星期1、2代表星期2,其他的一次类推了)
int day = d2.getDay();

使用Date类中的get方法。需要注意的是使用getYear获得的是Date对象中年份减去1900以后的值,所以需要显示对应的年份则需要在返回值的基础上加1900,月份类似。在Date类中还提供了getDay方法,用于获得Date对象代表的时间是星期几Date类规定周日是0,周一是1,周二是2,后续的依次类推。

二、Calendar类

从JDK1.1版本开始,在处理日期和时间时,系统推荐使用Calendar类进行实现(Date的一些方法都过时了)。在设计上,Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些,下面就介绍一下Calendar类的使用。

Calender类是一个抽象类,在实际使用时实现特定的子类的对象,使用getInstance()方法创建即可。

1.使用Calendar类代表当前时间

Calendar c = Calendar.getInstance();
System.out.println(c);
 //结果: 
 //java.util.GregorianCalendar[time=1640766764310,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=11,WEEK_OF_YEAR=1,WEEK_OF_MONTH=5,DAY_OF_MONTH=29,DAY_OF_YEAR=363,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=32,SECOND=44,MILLISECOND=310,ZONE_OFFSET=28800000,DST_OFFSET=0]

返回的是一个Calendar对象,由于Calendar类是抽象类,且Calendar类的构造方法是protected的,所以无法使用Calendar类的构造方法来创建对象,API中提供了getInstance方法用来创建对象。

使用该方法获得的Calendar对象代表当前的系统时间,由于Calendar类toString实现的没有Date类那么直观,所以直接输出Calendar类的对象意义不大。

2.使用Calendar类代表指定的时间

1)指定日期中,年月日
//获取获取系统的当前日历对象
Calendar c1 = Calendar.getInstance();
c1.set(2021,8-1,28);

使用过Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后在设定该对象中的年月日参数来完成。set方法的声明为:public final void set(int year,int month,int date)

以上示例代码设置的时间为2021年8月28日,其参数的结构和Date类不一样。Calendar类中年份的数值直接书写,月份的值为实际的月份值减1日期的值就是实际的日期值。

备注:看见另外一种方法指定日期:

Calendar current = Calendar.getInstance();
String strTime = "2000-03-05";
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(strTime);
current.setTime(date);//将时间对象data设置为新的日历
System.out.println("修改后的系统时间为:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(current.getTime()));

2)指定日期年月日,中某个日期

如果只设定某个字段某个字段,例如日期的值,则可以使用如下set方法:
public void set(int field,int value),在该方法中,参数field代表要设置的字段的类型,常见类型如下:

Calendar.YEAR 年份
Calendar.MONTH 月份;
Calendar.DATE 日期;当月的第几天
Calendar.DAY_OF_MONTH 日期,和Calendar.DATE字段完全相同;
Calendar.HOUR 12小时制的小时数;
Calendar.HOUR_OF_DAY 24小时制的小时数;
Calendar.MINUTE 分钟;
Calendar.SECOND 秒;
Calendar.DAY_OF_WEEK 星期几。
Calendar c1 = Calendar.getInstance();
System.out.println(c1.get(Calendar.YEAR) + "-" + c1.get(Calendar.MONTH) + "-" + c1.get(Calendar.DATE));
//2021-11-29

c1.set(Calendar.DATE,10);
System.out.println("日期设置为10号后:" + c1.get(Calendar.YEAR) + "-" + c1.get(Calendar.MONTH) + "-" + c1.get(Calendar.DATE));
//日期设置为10号后:2021-11-10

该代码的作用是将c1对象代表的时间中日期设置为10号,其它所有的数值会被重新计算,例如星期几以及对应的相对时间数值等。

3.Calendar类常用方法

方法 作用
static Calendar getInstance() 使用默认时区和区域设置获取日历。通过该方法生成Calendar对象。如下所示:Calendar cr=Calendar.getInstance();
public void set(int year,int month,int date,int hourofday,int minute,int second) 设置日历的年、月、日、时、分、秒。
public int get(int field) 返回给定日历字段的值。所谓字段就是年、月、日等等。
public void setTime(Date date) 使用给定的Date设置此日历的时间。Date------Calendar,重新设置时间
public Date getTime() 返回一个Date表示此日历的时间。Calendar-----Date,格式:Sat Sep 08 10:10:10 CST 2012,返回一个Date时间
abstract void add(int field,int amount) 该方法的作用是在Calendar对象中的某个字段上增加或减少一定的数值,增加是amount的值为正,减少是amount的值为负。如下所示:Calendar c3 = Calendar.getInstance();c3.add(Calendar.DATE,100);--计算100天以后的时间
public long getTimeInMillis() 以毫秒为单位返回该日历的时间值。返回毫秒值

案例:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class test {
    public static void main(String[] args) throws ParseException {
        //获 取获取系统的当前日历对象
        Calendar current = Calendar.getInstance();

        //1、获取今天是周几,在Calendar类中,周日是1,周一是2,周二是3,依次类推。
        int weekDay = current.get(Calendar.DAY_OF_WEEK);
        System.out.println("今天是周:" + (weekDay - 1));

        //2、获取系统当前年
        int year = current.get(Calendar.YEAR);
        System.out.println("今年是:" + year + "年");

        //3、获取系统当前月
        int month = current.get(Calendar.MONTH);
        System.out.println("本月是:" + (month + 1) + "月");

        //4、获取系统当前日
        int day = current.get(Calendar.DATE);
        System.out.println("今天是" + day + "号");

        //5、获取上午跟下午
        int am_pm = current.get(Calendar.AM_PM);
        if (am_pm == 0)
            System.out.println("是上午");
        else
            System.out.println("是下午");

        //6、获取当前的系统时间[date-->String]的过程
        Date time = current.getTime();//获取的是当前系统的时间,Wed Dec 29 17:20:51 CST 2021
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
        String showTime = format.format(time);
        System.out.println("当前系统时间为:" + showTime);

        //7、自定义日历的时间
        String strTime = "2000-03-05";
        Date date = new SimpleDateFormat("yyyy-MM-dd").parse(strTime);
        current.setTime(date);//将时间对象data设置为新的日历
        System.out.println("修改后的系统时间为:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(current.getTime()));

    }

}


在Calendar类中,周日是1,周一是2,周二是3,依次类推。

三、SimpleDateFormat类

SimpleDateFormat类可以实现java中日期格式的转化,将String类型的时间格式转化成Date类型或者将Date类型时间转化成为String类型

1.String 类型转化成Date

try {
            String startTime = "2021-12-29";
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date start = sdf.parse(startTime);
            System.out.println(start);
            //getTime():返回的时间是距离1970年的毫秒数.值不受setTime()的影响
            System.out.println(start.getTime());
        }catch (ParseException e){
            e.printStackTrace();

        }
  • 这里要注意,传递进来的startTime是String类型的字符串,其格式必须和SimpleDateFormate里面的参数形式一直,不是何格式的字符串都可以转化,要不会出现转发异常。
  • SimpDateFormat的parse()方法,可能抛出ParseException异常,需要异常处理

2.Date类型转化成为String

//获取系统当前时间
Date now=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm");
System.out.println(sdf.format(now)); //2021/12/29 15:12

3.其它日期格式

SimpleDateFormat sdf0 =new SimpleDateFormat("Gyyyy年MM月dd日 HH时mm分ss秒");
 //公元2021年12月29日 15时13分32秒
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm");
//2021/12/29 15:13
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//2021-12-29 15:13:32
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E ");
//2021年12月29日 15时13分32秒 星期三 
SimpleDateFormat sdf4 = new SimpleDateFormat("yyyy/MM/dd E");
//2021/12/29 星期三
SimpleDateFormat sdf5 = new SimpleDateFormat("一年中的第 D 天 ,第w个星期 ,一个月中第W个星期 ,k时 z时区");
//一年中的第 363 天 ,第1个星期 ,一个月中第5个星期 ,15时 CST时区

SimpleDateFormat日期-时间格式模式参数::

字母 对应日期或时间元素 表示 示例
G 年代标志符 标志符 Text AD
y Year 1996; 96
M 年中的月份 Month July; Jul; 07
w 年中的周数 Number 27
W 月份中的周数 Number 2
D 年中的天数 Number 189
d 月份中的天数 Number 10
F 月份中的星期 Number 2
E 星期中的天数 Text Tuesday; Tue
a Am/pm 标记 Text PM
H 一天中的小时数(0-23) Number 0
k 一天中的小时数(1-24) Number 24
K am/pm 中的小时数(0-11) Number 0
h am/pm 中的小时数(1-12) Number 12
m 小时中的分钟数 Number 30
s 分钟中的秒数 Number 55
S 毫秒数 Number 978
z 时区 General time zone Pacific Standard Time; PST; GMT-08:00
Z 时区 RFC 822 time zone -0800

四、后记

最后:案例这里就不介绍了呀,上面的三个类Date、SimpleDateFormat、Calendar理解到了,可以根据百度如何实现需求,在看别人的代码就可以看懂了,而不是懵的,只会复制黏贴。

其实java种的类很多方法很多,不是每个都要理解到、需要用的时候可以看懂就好。但是常用的还是要理解,比如时间类,因为工作中用到的就很多。数据就天天要使用到时间。
我还处于升级到第一步的过程中-----熟练

目前不怎么喜欢用语雀记笔记,因为笔记记多了,加载的时候很慢。看的时候觉得不是很方便

参考文章1:Java的Date类与Calendar类
参考文章2:java时间类Date、Calendar及用法(推荐)
参考文章3:java 中的Calendar常用方法(推荐)
参考文章4:java 日期相关Date、SimpleDateFormat、Calendar区分和使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章