java 日期时间操作(一)java8之前操作

本文详细介绍Java中日期时间的处理方式,包括使用Date、Calendar、GregorianCalendar类创建、格式化日期时间,以及SimpleDateFormat类的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 java.util.Date类

1、创建当前时间Date对象

//创建一个代表系统当前日期时间的Date对象
Date date = new Date();

2、创建指定日期、时间的Date对象
因为Date类的时间是以1900开始的,月份从0开始的。所以再new Date对象时,设置的年份应该为指定年份-1900,月份应该为指定月份-1。

//创建一个代表2020年4月21号的Date对象,该方法已过时
Date date = new Date(120, 3, 21); 

3、获取Date对象包含的日期时间信息

Date date = new Date(120, 3, 21); 
//下列方法都已过时
//获得年份 (注意年份要加上1900,这样才是正确的年份)
int year = date.getYear() + 1900;

//获得月份  (注意月份要加1,这样才是正确的月份)
int month = date.getMonth() + 1;

//获得日期
int day = date.getDate();

//获得小时
int hour = date.getHours();//不设置默认为0

//获得分钟
int minute = date.getMinutes();

//获得秒
int second = date.getSeconds();

//获得星期 (星期是从0开始的,0为星期日,一为星期一)
int week = date.getDay();

二、java.util.Calendar类

1、创建当前时间的Calendar对象

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

2、创建指定日期、时间的Calendar对象

//创建一个代表2020年4月21日的Calendar对象
Calendar c1 = Calendar.getInstance();
c1.set(2020, 3, 21);//调用:public final void set(int year,int month,int date)

3、手动设置日期、时间信息
使用set方法设置对应的日期时间信息。

    //设置信息时,其它所有的数值会被重新计算
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR,2020);//2020年
	cal.set(Calendar.MONTH,8);//9月
	cal.set(Calendar.DAY_OF_MONTH,27);//27号
	cal.set(Calendar.HOUR_OF_DAY,9);//小时
    cal.set(Calendar.MINUTE,27);//分钟
	cal.set(Calendar.SECOND,59);//秒

Calendar常用常量

Calendar.YEAR——年份
Calendar.MONTH——月份,从0开始,0-11
Calendar.DATE——日期
Calendar.DAY_OF_MONTH——本月的日期,和DATE相同
Calendar.HOUR——12小时制的小时
Calendar.HOUR_OF_DAY——24小时制的小时
Calendar.MINUTE——分钟
Calendar.SECOND——秒
Calendar.DAY_OF_WEEK——星期几,从星期日开始,1-7,1代表星期日,2代表星期一,和Date有点差别

使用add方法进行日期时间计算。(其它所有的数值会被重新计算)

 Calendar c1 = Calendar.getInstance();
 //把c1对象的日期加上10,其它所有的数值会被重新计算,例如4月21号加上10就会变成5月1号,
 //add方法在执行时会重新计算其他值
  c1.add(Calendar.DATE, 10);
 //把c1对象的日期加上-10,其它所有的数值会被重新计算
 c1.add(Calendar.DATE, -10);

使用roll方法进行日期时间计算。(只会处理计算的字段,其他字段的逻辑不会改变)

Calendar calendar = Calendar.getInstance();
calendar.set(2020, 0, 1);//代表2020年1月1日
calendar.roll(Calendar.MONTH, -1);//这样就将日期设置成了2020年12月1日。

4、获取Calendar对象的日期时间信息
使用get方法获取Calendar对象的日期时间信息

Calendar c1 = Calendar.getInstance();

int year = c1.get(Calendar.YEAR);    //年

int month = c1.get(Calendar.MONTH) + 1;    //月(MONTH+1)

int date = c1.get(Calendar.DATE);    //日

int hour = c1.get(Calendar.HOUR_OF_DAY);    //时

int minute = c1.get(Calendar.MINUTE);    //分

int second = c1.get(Calendar.SECOND);    //秒

int week= c1.get(Calendar.DAY_OF_WEEK);   //星期几 从星期日开始,1-7,1代表星期日,2代表星期一,和Date有点差别

5、Calendar类属性和方法

类型或返回值详细信息
static intALL_STYLES getDisplayNames的样式说明符, 表示所有样式的名称,如“1月”和“1月”。
static intAM AM_PM字段的值表示从午夜到中午之前的一天中的一段时间。
static intAM_PM 对于现场数 get和 set指示是否 HOUR是前或中午之后。
static intAPRIL MONTH字段的价值 指示了格里高利和朱利安日历中的第四个月。
protected booleanareFieldsSet 如果 fields[]与当前设置的时间同步,则为真。
static intAUGUST MONTH领域的价值 指示了公历和朱利安日历中的第八个月。
static intDATE get和 set字段编号表示该月的日期。
static intDAY_OF_MONTH get字段编号和 set本月的日期。
static intDAY_OF_WEEK get字段编号和 set表示一周中的日期。
static intDAY_OF_WEEK_IN_MONTH get字段编号和 set当月的 set几的序号。
static intDAY_OF_YEAR get和 set字段编号, set本年度的日数。
static intDECEMBER MONTH字段的值表示公历和朱利安日历中的第十二个月。
static intDST_OFFSET get和 set字段编号 get夏令时偏移量(以毫秒为单位)。
static intERA get和 set字段号表示时代,例如在儒略历中的AD或BC。
static intFEBRUARY MONTH字段的价值表示今年第二个月在公历和朱利安日历。
static intFIELD_COUNT get和 set的不同字段的数量。
protected int[]fields 该日历的当前设置时间的日历字段值。
static intFRIDAY DAY_OF_WEEK字段的值表示周五。
static intHOUR get和 set字段编号, get上午或下午的小时。
static intHOUR_OF_DAY get字段编号和 set当天的小时数。
protected boolean[]isSet 说明是否设置日历的指定日历字段的标志。
protected booleanisTimeSet 如果那么那么 time的值是有效的。
static intJANUARY MONTH字段的价值表示今年首次在公历和朱利安日历。
static intJULY MONTH字段的值代表了 公历和朱利安日历中的第七个月。
static intJUNE MONTH字段的价值 指示了公历和朱利安日历中的第六个月。
static intLONG getDisplayName和 getDisplayNames相当于 LONG_FORMAT的样式说明 符 。
static intLONG_FORMAT getDisplayName和 getDisplayNames的样式说明 符 , 表示用于格式的长名称。
static intLONG_STANDALONE 一个 getDisplayName和 getDisplayNames的样式说明 符 , 表示一个独立使用的长名称,例如月份名称作为日历头。
static intMARCH MONTH字段的值代表了 公历和朱利安日历中的第三个月。
static intMAY MONTH领域的价值 指示了公历和朱利安日历中的第五个月。
static intMILLISECOND get和 set字段号表示 get内的 set数。
static intMINUTE get和 set字段编号表示小时内的分钟。
static intMONDAY DAY_OF_WEEK字段的值表示星期一。
static intMONTH get和 set字段号表示月份。
static intNARROW_FORMAT getDisplayName和 getDisplayNames的样式说明 符 , 表示用于格式的窄名称。
static intNARROW_STANDALONE getDisplayName和 getDisplayNames的样式说明 符 独立地表示一个狭义的名称。
static intNOVEMBER MONTH领域的价值 指示了公历和朱利安日历中的第十一个月。
static intOCTOBER MONTH字段的价值表示在公历和朱利安日历中的一年中的第十个月。
static intPM AM_PM字段的值表示从中午到午夜之前的一天中的一段时间。
static intSATURDAY DAY_OF_WEEK字段的值表示星期六。
static intSECOND get和 set字段编号表示分钟内的第二个。
static intSEPTEMBER MONTH字段的值代表了 公历和朱利安日历中的第九个月。
static intSHORT getDisplayName和 getDisplayNames的样式说明 符 , 相当于 SHORT_FORMAT 。
static intSHORT_FORMAT getDisplayName和 getDisplayNames的样式说明 符 , 表示用于格式的短名称。
static intSHORT_STANDALONE 一个用于 getDisplayName和 getDisplayNames的样式说明 符 , 表示一个简单的名称,例如一个月缩写作为日历头。
static intSUNDAY DAY_OF_WEEK字段的值表示星期天。
static intTHURSDAY DAY_OF_WEEK字段的值表示星期四。
protectedlong time 这个日历的当前设定时间,以1970年1月1日,格林尼治标准时间0:00:00之后的毫秒表示。
static intTUESDAY DAY_OF_WEEK字段的值表示周二。
static intUNDECIMBER MONTH字段的值表示一年的第十三个月。
static intWEDNESDAY DAY_OF_WEEK字段的值表示周三。
static intWEEK_OF_MONTH get和 set字段编号, set当月的周数。
static intWEEK_OF_YEAR get和 set字段编号, set本年度的周数。
static intYEAR get现场编号和 set表示年份。
static intZONE_OFFSET get和 set字段编号, get GMT以毫秒为 get的原始偏移量。

三、java.util.GregorianCalendar类

GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家使用的标准日历系统。

GregorianCalendar类对象的创建

//在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar
GregorianCalendar currentDate = new GregorianCalendar();

//或者使用指定日期时间的构造方法
GregorianCalendar(int year, int month, int dayOfMonth) 
GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute) 。
GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second)

注:GregorianCalendar有一个方法:boolean isLeapYear(int year) 确定给定的年份是否为闰年

四、日期格式化SimpleDateFormat类

SimpleDateFormat类用来将日期转换为特定格式的日期字符串以及将特定格式的日期字符串转换为Date类型。
1、使用format() 方法将日期类型转换为指定格式的字符串

Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
String str = dateFormat.format(date);
System.out.println(str);

2、使用parse()方法将字符串转换为Date类型

try{
    String str="2019-1-21";
    SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
    Date date= sdf.parse(str);
    System.out.println(date);
}catch (Exception e){
    e.printStackTrace();
}

注:new SimpleDateFormat 对象时可以设置语言环境:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINESE);

SimpleDateFormat 自定义格式中常用的字母及含义

字母含义示例
y年份。一般用 yy 表示两位年份,yyyy 表示 4 位年份使用 yy 表示的年扮,如 11;使用 yyyy 表示的年份,如 2011
M月份。一般用 MM 表示月份,如果使用 MMM,则会根据语言环境显示不同语言的月份使用 MM 表示的月份,如 05;使用 MMM 表示月份,在 Locale.CHINA语言环境下,如“十月”;在 Locale.US语言环境下,如 Oct
d月份中的天数。一般用 dd 表示天数使用 dd 表示的天数,如 10
D年份中的天数。表示当天是当年的第几天, 用 D 表示使用 D 表示的年份中的天数,如 295
E星期几。用 E 表示,会根据语言环境的不同, 显示不同语言的星期几使用 E 表示星期几,在 Locale.CHINA 语言环境下,如“星期四”;在 Locale.US 语言环境下,如 Thu
H一天中的小时数(0~23)。一般用 HH 表示小时数 使用 HH 表示的小时数,如 18
h一天中的小时数(1~12)。一般使用 hh 表示小时数使用 hh 表示的小时数,如 10 (注意 10 有可能是 10 点,也可能是 22 点)
m分钟数。一般使用 mm 表示分钟数使用 mm 表示的分钟数,如 29
s秒数。一般使用 ss 表示秒数使用 ss 表示的秒数,如 38
S毫秒数。一般使用 SSS 表示毫秒数 使用 SSS 表示的毫秒数,如 156

五、时间类和字符串转换

Calendar 转化 String

Calendar calendar= Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = sdf.format(calendar.getTime());

String 转化Calendar

String str="2019-1-21";
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
Date date =sdf.parse(str);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

Date 转化String

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
String dateStr=sdf.format(new Date());

String 转化Date

String str="2019-1-21";
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
Date date= sdf.parse(str);

Date 转化Calendar

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

Calendar转化Date

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

参考:

https://www.cnblogs.com/gu-bin/p/10022703.html
https://www.jianshu.com/p/bb08da5fece4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值