Calendar
简述
Calendar日历类,通过这个类可以像日历一般得到与时间有关的所有属性,如周几、第几周等。
在日常开发中,开发者只需掌握Calendar类特定的几种静态属性,以及方法即可满足开发需求。
此外在Calendar.getInstance()不仅能获取当前的时间,还能指定需要获取的时间点
在项目中达到定时的作用。
静态常量
含义
1. 可使用这些常量进行赋值,或者通过这些静态常量获取值
2. Java月份是从0-11计算的,所以在获取月份是需要+1,设置月份时需要-1
3. 赋值时,我们一般采用年月日时分秒
Calendar.YEAR、
Calendar.MONTH 、
Calendar.DAY_OF_MONTH、
Calendar.HOUR_OF_DAY 、
Calendar.MINUTE、
Calendar.SECOND
示例
Calendar cal = Calendar.getInstance();
int cal.get(Calendar.DATE); 当天是本月第几天
int cal.get(Calendar.DAY_OF_MONTH); 当天是本月第几天(与DATE同义)
int cal.get(Calendar.DAY_OF_WEEK); 当天是本周第几天,从周天计算
若今天星期二,那么返回3
cal.get(Calendar.DAY_OF_YEAR); 当天是本年第几天
cal.get(Calendar.HOUR); 当天12小时制时间
cal.get(Calendar.HOUR_OF_DAY); 当天24小时制时间
cal.get(Calendar.MILLISECOND); 当前毫秒数,0~1000毫秒
cal.get(Calendar.MINUTE); 分钟数
cal.get(Calendar.SECOND); 秒数
cal.get(Calendar.WEEK_OF_MONTH); 这一周是这一月中第几周
cal.get(Calendar.WEEK_OF_YEAR); 这一周是这一年第几周
cal.get(Calendar.MONTH); 月份,获取需要 +1,那
么,赋值时需要 -1
常用方法
static Calendar getInstance() 使用默认时区和区域设置获取一个日历对象
int get(int field) 返回给定日历字段的值,如get(1)是返回当前日期所在的年,2020
Date getTime() Calendar转Date
long getTimeInMillis() 获取当前时间的毫秒值,相当于Date中的getTime
int getFirstDayOfWeek() 获取指定日期所在周的第一个的日期,默认的一周的第一天是周日
void add(int field,int amount) 根据日历的规则,将指定的时间量添加或减去到给定的日历字段
void set(int field,int value) 将给定的日历字段设置为给定的值,对于每个字段赋值,代码重复较大,一般不使用
void set(int year,int month,int date)
设置日历字段中的值year,month和day_of_month效率高
void roll(int field,int amount) 将指定的时间量添加到指定的字段上,而不更改较大的字段。一般不使用,
原因是该方法只在一个月里面循环计算,其大小不会超过该月最值
重点
1.关于add的计算,cal.add(Calendar.MONTH, 1);如果当前是8-31则9-31。
2.关于set的赋值,月份的起始值是0,所以要设置8月时,使用7而不是8,
cal.set(Calendar.MONTH,7)
3.关于set的赋值,week需要制定setFirstDayOfWeek
4.关于roll的计算,cal.roll(Calendar.DAY_OF_MONTH, 32),虽然32已经超出了最大的
可能31,但是cal实际是不会超出该月的,而是把32减去该月天数之后,重新计算剩下的天数
Calendar 获取当天\当月\当周的区间
// 当天
public String getThisToday(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY,0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND,0);
String start = sdf.format(cal.getTime());
cal.set(Calendar.HOUR_OF_DAY,23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND,59);
String end = sdf.format(cal.getTime());
return start+"|"+end;
}
// 本周
public String getThisWeekDate(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar ca = Calendar.getInstance();
ca.setFirstDayOfWeek(Calendar.MONDAY);
ca.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);
ca.set(ca.get(Calendar.YEAR), ca.get(Calendar.MONTH),ca.get(Calendar.DATE),23,59,59);
String end = sdf.format(ca.getTime());
ca.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
ca.set(Calendar.HOUR_OF_DAY,0);
ca.set(Calendar.MINUTE, 0);
ca.set(Calendar.SECOND,0);
String start = sdf.format(ca.getTime());
return start+"|"+end;
}
//本月日期段
public String getThisMonthDate(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar cc2 = Calendar.getInstance();
int maxMonthDay = cc2.getActualMaximum(Calendar.DAY_OF_MONTH);
cc2.set(cc2.get(Calendar.YEAR), cc2.get(Calendar.MONTH),maxMonthDay,23,59,59);
String end = sdf.format(cc2.getTime());
cc2.set(cc2.get(Calendar.YEAR), cc2.get(Calendar.MONTH),1,0,0,0);
String start = sdf.format(cc2.getTime());
return start+"|"+end;
}
Calendar 获取当前月/下月/前月
//获取当月
public static String getNowTime() {
Calendar cal = Calendar.getInstance();
SimpleDateFormat dft = new SimpleDateFormat("yyyyMMdd");
String lastMonth = dft.format(cal.getTime());
return lastMonth;
}
//获取下个月
public static String getPreMonth() {
Calendar cal = Calendar.getInstance();
cal.add(cal.MONTH, 1);
SimpleDateFormat dft = new SimpleDateFormat("yyyyMMdd");
String preMonth = dft.format(cal.getTime());
return preMonth;
}
//获取上个月
public static String getLastMonth() {
Calendar cal = Calendar.getInstance();
cal.add(cal.MONTH, -1);
SimpleDateFormat dft = new SimpleDateFormat("yyyyMMdd");
String lastMonth = dft.format(cal.getTime());
return lastMonth;
}
Calendar 简单示例
获取当天0点时间
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);//控制时
cal.set(Calendar.MINUTE, 0);//控制分
cal.set(Calendar.SECOND, 0);//控制秒
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(cal.getTime()));
--2020-05-26 00:00:00
获取当天12点时间
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 12);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(cal.getTime()));
--2020-05-26 12:00:00
获取本周一0点时间
Calendar cal = Calendar.getInstance();
cal.set(cal.get(Calendar.YEAR),cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0,0);
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(cal.getTime()));
--2020-05-25 00:00:00
DateFormat
简述
在Java中,可以使用DateFormat和SimpleDateFormat类格式化日期,DateFormat是
日期/时间格式化子类的抽象类,它以与语言无关的方法格式化并解析日期或时间。
在创建DateFormat对象时不能使用New关键字,而应该使用DateFormat类的静态方法
getDateInstance()
格式化日期表示将日期/时间格式转换为预先定义的日期/时间格式。例如
Fri May 18 15:46:24 CST2016 格式转换为
2016-5-18 15:46:24 星期五 的格式
简单示例
// 获取不同格式化风格和中国环境的日期
DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT, Locale.CHINA);
DateFormat df2 = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA);
DateFormat df3 = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.CHINA);
DateFormat df4 = DateFormat.getDateInstance(DateFormat.LONG, Locale.CHINA);
// 获取不同格式化风格和中国环境的时间
DateFormat df5 = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.CHINA);
DateFormat df6 = DateFormat.getTimeInstance(DateFormat.FULL, Locale.CHINA);
DateFormat df7 = DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.CHINA);
DateFormat df8 = DateFormat.getTimeInstance(DateFormat.LONG, Locale.CHINA);
// 将不同格式化风格的日期格式化为日期字符串
String date1 = df1.format(new Date());
String date2 = df2.format(new Date());
String date3 = df3.format(new Date());
String date4 = df4.format(new Date());
// 将不同格式化风格的时间格式化为时间字符串
String time1 = df5.format(new Date());
String time2 = df6.format(new Date());
String time3 = df7.format(new Date());
String time4 = df8.format(new Date());
// 输出日期
System.out.println("SHORT:" + date1 + " " + time1);
System.out.println("FULL:" + date2 + " " + time2);
System.out.println("MEDIUM:" + date3 + " " + time3);
System.out.println("LONG:" + date4 + " " + time4);
------------------------------------------------------------------
SHORT:20-4-17 下午2:29
FULL:2020年4月17日 星期五 下午02时29分08秒 CST
MEDIUM:2020-4-17 14:29:08
LONG:2020年4月17日 下午02时29分08秒
须知
格式化样式主要通过DateFormat常量设置,将不同的常量传入到对应方法中,以控制结果的长
度。DateFormat类的常量有
SHORT 完全是数字,如12.5.10
MEDIUM 较长
LONG 更长
FULL 完全指定
SimpleDateFormat
简述
在DateFormat类格式化日期/时间并不能满足要求时,就需要使用DateFormat的子类SimpleDateFormat
SimpleDateFormat 是一个以 与语言环境有关的方式来格式化和解析日期的具体类。
它允许格式化(日期-->文本)、解析(文本-->日期)和规范化。
SimpleDateFormat使得操作者可以选择自己定义的日期/时间格式
构造方法
SimpleDateFormat() 用默认的格式和默认的语言环境构造SimpleDateFormat
SimpleDateFormat(String pattern)
用指定的格式和默认的语言环境构造SimpleDateFormat
SimpleDateFormat(String pattern,Locale locale)
用指定的格式和指定的语言环境构造SimpleDateFormat
---------------------------------------------------------------------
普通方法
String format(Date date)
将日期类型(Date)数据格式化为字符串(String)
Date parse(String target)
将字符串类型(java.lang.String)解析为日期类型
(java.util.Date)
yyyy-MM-dd hh:mm:ss须知
yyyy
含义
代表年,不区分大小写,假设年份2020
规则
y、yyy、yyyy 匹配的是4位完整的年,如2020
yy 匹配的是年份的后两位,如20
超过4位y 会在年份前面加0补位,如02020
MM
含义
代表月,只能使用大写,假设月份是4
规则
M 对应是4
MM 对应是04
MMM、MMMM.... 对应四月
dd
含义
代表日,只能使用小写,假设日是12号
规则
d、dd 对应12
超过2位 在数字前0补位,如0013
hh
含义
代表时,区分大小写,大写是24进制计时,小写是12进制计时,假设是15时
规则
H、HH 对应15,超过2位,会在数字前0补位
h 对应3
hh 对应03,超过2位,会在数字前0补位
mm
含义
代表分,只能使用小写,假设是12分
规则
m、mm 对应12,超过2位,会在数字前0补位
ss
含义
代表秒,只能使用小写,假设是15秒
规则
s、ss 都对应15,超过2位,会在数字前0补位
E
含义
星期,只能使用大写,假设是星期五
规则
E、EE、EEE... 都对应星期五
a
含义
代表上午还是下午,如果是上午
----------------------------------------------------------------------
其中分隔符"-",可以替换成其他非字母的任意字符,也可以是汉字
简单示例
Date newTime = new Date();
//设置时间格式
SimpleDateFormat sdf1 = new SimpleDateFormat("y-M-d h:m:s a E");
SimpleDateFormat sdf2 = new SimpleDateFormat("yy-MM-dd hh:mm:ss a E");
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MMM-ddd hhh:mmm:sss a E");
SimpleDateFormat sdf4 = new SimpleDateFormat("yyyyy-MMMM-dddd hhhh:mmmm:ssss a EEEE");
//获取的时间,是本机的时间
String formatDate1 = sdf1.format(newTime);
String formatDate2 = sdf2.format(newTime);
String formatDate3 = sdf3.format(newTime);
String formatDate4 = sdf4.format(newTime);
System.out.println(newTime);
System.out.println(formatDate1);
System.out.println(formatDate2);
System.out.println(formatDate3);
System.out.println(formatDate4);
----------------------------------------------------------------------
Fri Apr 17 13:18:16 CST 2020
2020-4-17 1:18:16 下午 星期五
20-04-17 01:18:16 下午 星期五
2020-四月-017 001:018:016 下午 星期五
02020-四月-0017 0001:0018:0016 下午 星期五