Date、DateFormat和Calendar
目录
Date
-------Date类的构造函数
-------Date类中的常用方法
DateFormatSimple
-------DateFormat的构造函数
-------SimpleDteFormat常用的函数
Calendar
-------GregorianCalendar对象的获取方式
-------Calendar类的常用方法
-------Calendar使用中的问题
--------------代码示例
--------------原因分析
--------------解决方案(DateTimeUtils)
时间处理相关的工具类DateTimeUtils
Date
Date类是java.util包下表示日期的类, 精确到毫秒值;
Date类的构造函数:
// 用来创建当前系统时间对应的日期对象
public Date() {
this(System.currentTimeMillis());
}
// 用来创建以标准基准时间为基准,指定偏移毫秒数,对应的日期对象 参数单位:毫秒
// 标准基准时间:
// 0时区: 1970年01月01日 00:00:00
// 东八区: 1970年01月01日 08:00:00
public Date(long date) {
fastTime = date;
}
示例代码:
public class DateTest {
public static void main(String[] args) {
// 创建一个当前系统时间的日期对象
Date date01 = new Date();
System.out.println(date01); // Sun Jun 14 15:56:24 CST 2020
// 创建一个与标准基准时间偏移了1秒的日期对象
Date date02 = new Date(1000);
System.out.println(date02); // Thu Jan 01 08:00:01 CST 1970
}
}
Date类中的常用方法
- long getTime() 获取当前日期对 象距离标准基准时间的毫秒数
- void setTime(long time) 设置当前日期对象距离标准基准时间的毫秒数
- boolean after(Date when) 测试此日期是否在指定日期之后
- boolean before(Date when) 测试此日期是否在指定日期之前
public class DateTest {
public static void main(String[] args) {
// 创建一个当前系统时间的日期对象
Date date01 = new Date();
System.out.println(date01); // Sun Jun 14 15:56:24 CST 2020
// 创建一个与标准基准时间偏移了1秒的日期对象
Date date02 = new Date(1000);
System.out.println(date02); // Thu Jan 01 08:00:01 CST 1970
// 获取
System.out.println(date01.getTime()); // 1592121661184
System.out.println(date02.getTime()); // 1000
// 设置:
date01.setTime(2000);
System.out.println(date01);// Thu Jan 01 08:00:02 CST 1970
System.out.println(date01.getTime());// 2000
date02.setTime(3000);
System.out.println(date02);// Thu Jan 01 08:00:03 CST 1970
System.out.println(date02.getTime());// 3000
System.out.println(date01.after(date02)); // false
System.out.println(date01.before(date02)); // true
}
}
DateFormat
DateFormat是一个表示日期格式化的类, 是抽象类, 一般使用其子类 SimpleDateFormat;
DateFormat的作用: 实现日期与文本之间的相互转化;
String ----> Date;
Date ----> String;
SimpleDateFormat的构造函数
// 参数 pattern:是String类型,用来指定日期的格式
// pattern的格式规则
// y 年
// M 月
// d 日
// H 时
// m 分
// s 秒
// 常用的日期格式: yyyy年MM月dd日 HH时mm分ss秒
// 常用的日期格式: yyyy-MM-dd HH:mm:ss
public SimpleDateFormat(String pattern){
this(pattern, Locale.getDefault(Locale.Category.FORMAT));
}
SimpleDteFormat常用的函数
- String format(Date date); // 格式化
- Date parse(String source); // 解析
需要注意: 解析的时候,字符串日期格式一定要和日期格式化对象指定的日期格式一致;
代码示例:
public class DateFormatTest {
public static void main(String[] args) {
Date date = new Date();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd");
// 格式化
System.out.println(sdf1.format(date)); // 2020年06月14日 16时31分50秒
System.out.println(sdf2.format(date)); // 2020-06-14 16:31:50
System.out.println(sdf3.format(date)); // 2020-06-14
try {
// 解析
Date dateP = sdf1.parse("2020年06月14日 16时31分50秒");
System.out.println(dateP); // Sun Jun 14 16:31:50 CST 2020
} catch (ParseException e) {
e.printStackTrace();
}
}
}
Calendar
Calendar类表示日历, 是一个抽象类, 一般使用其子类 GregorianCalendar;
GregorianCalendar对象的获取方式
public class CalendarTest {
public static void main(String[] args) {
// 1.通过GregorianCalendar()的构造函数获了
Calendar calendar01 = new GregorianCalendar();
// 2.通过Calendar.getInstance()函数获取
Calendar calendar02 = Calendar.getInstance();
System.out.println(calendar01.getClass().getName());//java.util.GregorianCalendar
System.out.println(calendar02.getClass().getName());//java.util.GregorianCalendar
// 两种方式获取到的是同一类对象(GregorianCalendar);
}
}
Calendar类的常用方法
- public int get(int field); // 获取某个字段的值
参数: 表示获取哪个字段的值,可以使用Calender中定义的常量来指定
- Calendar.YEAR: 年龄
- Calendar.MONTH :月
- Calendar.DAY_OF_MONTH:月中的日期
- Calendar.HOUR:小时
- Calendar.MINUTE:分钟
- Calendar.SECOND:秒
- Calendar.DAY_OF_WEEK:星期
- public void set(int field,int value); // 设置某个字段的值;
- public void add(int field,int amount); // 为某个字段增加/减少指定的值;
- void setTime(Date date); // 使用给定的 Date 设置此 Calendar 的时间;
- boolean before(Object when);
// 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果;
- boolean after(Object when);
// 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果;
需要注意:
- 日历对象中的月份: 0---11月 对应现实生活中的 1---12月
- 中国人: 星期一 <--> 星期日 一个礼拜的第一天是星期一,一个礼拜的最后一天是星期日;
- 外国人: 星期日 <--> 星期六 一个礼拜的第一天是星期日,一个礼拜的最后一天是星期六;
代码示例
public class CalendarTest {
public static void main(String[] args) {
Calendar calendar = new GregorianCalendar();
System.out.println(calendar.get(Calendar.YEAR)); // 2020
System.out.println(calendar.get(Calendar.MONTH)); // 5
System.out.println(calendar.get(Calendar.WEEK_OF_YEAR)); // 25
System.out.println(calendar.get(Calendar.WEEK_OF_MONTH)); // 3
calendar.set(Calendar.YEAR, 1999);
System.out.println(calendar.get(Calendar.YEAR));// 1999
calendar.add(Calendar.YEAR, 2);
System.out.println(calendar.get(Calendar.YEAR));// 2001
// 创建一个距离标准基准时间1小时的日期对象
Date date = new Date(1 * 60 * 60 * 1000);
// 调用日历对象的setTime方法,设置日历对象表示的日期
calendar.setTime(date);
// System.out.println(calendar);// 距离标准基准时间1小时的日期对应的日历对象
System.out.println(calendar.get(Calendar.YEAR)); // 1970
System.out.println(calendar.get(Calendar.MONTH)); // 0
System.out.println(calendar.get(Calendar.WEEK_OF_YEAR)); // 1
System.out.println(calendar.get(Calendar.WEEK_OF_MONTH)); // 1
Calendar cal2 = Calendar.getInstance();
// calendar: 距离标准基准时间1小时的日期对象
// cal3: 当前时间的日历对象
System.out.println(calendar.before(cal2));// true
System.out.println(calendar.after(cal2));// true
}
}
Calendar使用中的问题
代码示例
public class CalendarTest {
public static void main(String[] args) throws ParseException {
// 需求是希望把"2018-03-31"改为"2018-02-01";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.setTime(format.parse("2018-03-31"));
calendar.set(Calendar.YEAR,2018);
calendar.set(Calendar.MONTH,1);
String DateStr = format.format(calendar.getTime());
System.out.println(DateStr);// 2018-03-03
}
}
原因分析
Calendar类中的时间计算, 是以毫秒数来计算的, 上面的代码设置只是把月份变动了, 但是天数并没有变, 也就是说上面的代码实际上是表示打印"2018-02-31";
而2月份是没有31号的, 并且2018年的2月份只有28号, 所以就往后加了三天, 最终的打印结果就变成了"2018-03-03";
如果把2018改成2016, 那么打印出来的结果就是"2016-03-02", 因为2016年的2月份是29号;
解决方案(DateTimeUtils)
- 主动set日期;
- 清除日历对象所有数据;
- 根据年月, 去获取日期的最大值;
时间处理相关的工具类DateTimeUtils
public class DateTimeUtil {
public final static String PATTERN_LONG = "yyyy-MM-dd HH:mm:ss";
public final static String PATTERN_LONG2 = "yyyyMMdd HH:mm:ss";
public final static String PATTERN_A = "yyyyMM";
public final static String PATTERN_B = "yyyyMMdd";
public final static String PATTERN_C = "yyyy-MM-dd";
public static final String PATTERN_D = "yyMMdd";
public final static String PATTERN_ZH = "yyyy年MM月dd日";
public final static String PATTERN_ZH_MD = "MM月dd日";
private final static String[] WEEKDAYS = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
/**
* 格式化日期 按指定格式
*
* @param date 需要格式化的 日期对象
* @param pattern 日期样式
*/
public static String formatDate(Date date, String pattern) {
SimpleDateFormat format = new SimpleDateFormat(pattern);
return format.format(date);
}
/**
* 把字符串按格式转换成 Date对象
*
* @param text
* @param pattern 日期样式
* @return
*/
public static Date parse(String text, String pattern) {
SimpleDateFormat format = new SimpleDateFormat(pattern);
try {
return format.parse(text);
} catch (ParseException e) {
return null;
}
}
/**
* 获取当前时间 年 月 日 (月份要+1)
*
* @return
*/
public static String getDate() {
Calendar cal = Calendar.getInstance();
StringBuffer stringBuffer = new StringBuffer();
return stringBuffer.append(cal.get(Calendar.YEAR))
.append("年")
.append(cal.get(Calendar.MONTH) + 1)
.append("月")
.append(cal.get(Calendar.DAY_OF_MONTH))
.append("日")
.append(cal.get(Calendar.HOUR_OF_DAY))
.append(":")
.append(cal.get(Calendar.MINUTE))
.append(":")
.append(cal.get(Calendar.SECOND))
.toString();
}
/**
* 获取当天星期几
*
* @return
*/
public static String getDayOfWeek() {
Calendar cal = Calendar.getInstance();
return WEEKDAYS[cal.get(Calendar.DAY_OF_WEEK) - 1];
}
/**
* 获取几天之后或者几天之前星期几
*
* @param days 天数
* @return
*/
public static String getDateAfterDays(int days) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_WEEK, days);
return WEEKDAYS[cal.get(Calendar.DAY_OF_WEEK) - 1];
}
/**
* 获取某年某月的日期最大值
*
* @param year 年份
* @param month 月份
* @return 最大值
*/
public static int getLastDay(int year, int month) {
Calendar calendar = Calendar.getInstance();
calendar.clear(); //清除所有日期数据
if (year != 0) {
calendar.set(Calendar.YEAR, year);
}
calendar.set(Calendar.MONTH, month - 1);
return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
}
/**
* 根据年月获取当月最后一天
* @param yearmonth yyyy-MM
* @return yyyy-MM-dd
* @throws ParseException
*/
public static String getLastDayOfMonth(String yearmonth) {
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
Date dd = format.parse(yearmonth);
Calendar cal = Calendar.getInstance();
cal.setTime(dd);
int cc=cal.getActualMaximum(Calendar.DAY_OF_MONTH);
String result = yearmonth+"-"+cc;
return result;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
// 未完待加入......
}