日 期 时 间
1.日期工具Date
import java.utli.Date;
1.1日期工具的用法
有关实例化年、月、星期、小时、分、秒,其中特殊的三种如下:(get***)
- getYear()+1900;
- getMonth()+1;
- getDay():对于星期日来说,getDay返回的是0,而星期一返回的是1,此时解决办法是dayWeek = (dayWeek == 0) ? 7 : dayWeek;
【代码】
......
Date date = new Date();//创建一个新的日期实例,默认保存的是系统时间
System.out.println(date);
int year = date.getYear() + 1900;
System.out.println(year);
int month = date.getMonth() + 1;
System.out.println(month);
int dayWeek = date.getDay();
dayWeek = (dayWeek == 0) ? 7 : dayWeek;
System.out.println(dayWeek);
除了以上get***方法外,Date还提供了设置日期实例化的某个时间数值set***
Date date = new Date(); // 创建一个新的日期实例,默认保存的是系统时间
date.setYear(100); // 设置日期实例中的年份
int year = date.getYear() + 1900; // 获取日期实例中的年份
System.out.println("year=" + year);
date.setMonth(10); // 设置日期实例中的月份
int month = date.getMonth() + 1; // 获取日期实例中的月份
System.out.println("month=" + month);
date.setDate(20); // 设置日期实例中的日子
int dateInt = date.getDate(); // 获取日期实例中的日子
System.out.println("dateInt=" + dateInt);
date.setHours(12); // 设置日期实例中的时钟
int hour = date.getHours(); // 获取日期实例中的时钟
System.out.println("hour=" + hour);
date.setMinutes(30); // 设置日期实例中的分钟
int minute = date.getMinutes(); // 获取日期实例中的分钟
System.out.println("minute=" + minute);
date.setSeconds(59); // 设置日期实例中的秒钟
int second = date.getSeconds(); // 获取日期实例中的秒钟
System.out.println("second=" + second);
date.setTime(1000);
long time = date.getTime();
你们是否曾想过,怎么比较哪个时间较早,哪个时间较晚呢?
顾名思义,可以用equals方法、before方法以及after方法,为了减少内存空间,我们不妨把它们统一起来,于是就有了Date类型的compareTo方法,该方法返回-1表示A时间较早;返回0表示两者一样;返回1表示B时间较早。
【代码】
// 比较两个日期时间的先后关系
private static void compareDate() {
Date dateOld = new Date(); // 创建一个日期实例
Date dateNew = new Date(); // 创建一个日期实例
// 设置dateNew的时间总数(单位毫秒)。此处表示给当前时间增加一毫秒
dateNew.setTime(dateNew.getTime() + 1);
/*boolean equals = dateOld.equals(dateNew); // 比较两个时间是否相等
System.out.println("equals=" + equals);
boolean before = dateOld.before(dateNew); // 比较A时间是否在B时间之前
System.out.println("before=" + before);
boolean after = dateOld.after(dateNew); // 比较A时间是否在B时间之后
System.out.println("after=" + after);*/
// 比较A时间与B时间的先后关系。
// 返回-1表示A时间较早,返回0表示两个时间相等,返回1表示B时间较早
int compareResult = dateOld.compareTo(dateNew);
System.out.println("compareResult=" + compareResult);
}
1.2日期时间的格式化
为了达到用户的需求,如“2020-12-04 23:06:32”、“2020年12月04日”等等形式。
这就需要用到Java提供专门的日期格式化工具SimpleDateFormat
import java.text.SimpleDateFormat;
- 为该工具先创建一个指定规则的格式化实例
- 然后调用format方法,即可将某个日期实例转换为规定格式的字符串
// 获取当前的日期时间字符串
public static String getNowDateTime() {
// 创建一个日期格式化的工具
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//yyyy年MM月dd日...或yyyy-MM-dd或HH:mm:ss或HH:mm:ss.SSS
// 将当前日期时间按照指定格式输出格式化后的日期时间字符串
return sdf.format(new Date());
}
以下是日期时间格式的定义说明:
- 小写的yyyy:表示4位年份数字
- 大写的MM:表示两位月份数字
- 小写的dd:表示两位日期数字
- 大写的HH:表示24小时制
- 小写的hh:表示12小时制
- 小写的mm:表示两位分钟数字
- 小写的ss:表示两位秒钟数字
- 大写的SSS:表示3位毫秒数字
通过以上可看出,利用SimpleDateFormat将日期类型转换为字符串类型,不仅可以这样转换,还可将字符串类型转换为日期类型,这时需调用 parse 方法。
import jav.text.ParseException;
...throws ParseException
- 首先创建一个指定标记的格式化实例;
- 然后再调用该实例的parse方法,即可将某个对应格式的字符串转换为日期实例。
【代码】
String str = "2019-11-25 11:18:53";
// 创建一个日期格式化的工具
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dateFromStr = sdf.parse(str); // 从字符串中按照指定格式解析日期时间信息
2.日历工具Calendar
import java.utli.Calendar;
2.1日历工具的用法
- getInstance():创建日历实例,而非new关键字
- get():获得指定时间单位具体数值,如Calendar.YEAR、Calendar.DAY_OF_WEEK、…
Calendar calendar = Calendar.getInstance(); // 创建一个日历实例
int year = calendar.get(Calendar.YEAR); // 获取日历实例中的年份
System.out.println("year=" + year);
注意两点:
- Calendar的月份仍然从0开始计数,所以要获得月份的代码则需要+1;
int month = calendar.get(Calendar.MONTH) + 1; // 获取日历实例中的月份
System.out.println("month=" + month);
- Calendar的星期几是从1开始计数,星期日为1,星期一为2(与Date有所区别),且不符合国人的习惯,故采取以下代码解决:
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); // 获取日历实例中的星期几
dayOfWeek = dayOfWeek == 1 ? 7 : dayOfWeek - 1;
System.out.println("dayOfWeek=" + dayOfWeek);
另外,与Date相比,Calendar新增了类型有 Calendar.DAY_OF_YEAR(从年初开始数的日子)、Calendar.MILLISECOND(秒钟后面的毫秒)、Calendar.HOUR(十二小时制的时钟数值)、Calendar.HOUR_OF_DAY(二十四小时制的时钟数值)
......
int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR); // 获取日历实例中从年初开始数的日子
System.out.println("dayOfYear=" + dayOfYear);
int hour = calendar.get(Calendar.HOUR); // 获取日历实例中的时钟(12小时制)
System.out.println("hour=" + hour);
int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY); // 获取日历实例中的时钟(24小时制)
System.out.println("hourOfDay=" + hourOfDay);
int minute = calendar.get(Calendar.MINUTE); // 获取日历实例中的分钟
System.out.println("minute=" + minute);
int second = calendar.get(Calendar.SECOND); // 获取日历实例中的秒钟
System.out.println("second=" + second);
int milliSecond = calendar.get(Calendar.MILLISECOND); // 获取日历实例中的毫秒
System.out.println("milliSecond=" + milliSecond);
最后,是否曾想过,为了改变具体的日期,需要用到set()与get()两个方法,先通过get方法获得当前的时间数值,对当前数值增减之后再传给set方法,才能达到目的。
set方法用于设置数值:
- 带3个参数的set方法支持同时设置年月日
- 带6个参数的set方法支持同时设置年月日、时分秒
- 带2个参数的set方法可改变某个指定数值的时间单位【第一个参数:单位类型、第二个参数:具体的时间数值】
Calendar calendar = Calendar.getInstance(); // 创建一个日历实例
// 调用带三个参数的set方法同时设置日历实例的年、月、日
calendar.set(2020, 12, 06);
// 调用带六个参数的set方法同时设置日历实例的年、月、日、时、分、秒
calendar.set(2020, 12, 06, 23, 42, 40);
System.out.println("begin set dayOfMonth="
+ calendar.get(Calendar.DAY_OF_MONTH));
// 带两个参数的set方法允许把某个时间单位改为指定数值
calendar.set(Calendar.DAY_OF_MONTH, 1);
System.out.println("end set dayOfMonth=" + calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("begin set hourOfDay=" + calendar.get(Calendar.HOUR_OF_DAY));
联合使用get和set方法可以达到其目的,但是简单的功能还得两个步骤完成,为了优化其中,Calendar提供了add方法,允许直接设置相对数值。
// 调用add方法,直接在当前时间的基础上增加若干数值
calendar.add(Calendar.MINUTE, 10);
System.out.println("end add minute=" + calendar.get(Calendar.MINUTE));
还有一点就是Calendar工具保留了与Date时间校验相关的方法,用法与Date类型的同名方法一致,如下代码:
// 比较两个日历时间的先后关系
private static void compareCalendar() {
Calendar calendarOld = Calendar.getInstance(); // 创建一个日历实例
Calendar calendarNew = Calendar.getInstance(); // 创建一个日历实例
calendarNew.add(Calendar.SECOND, 1); // 给calendarNew加上一秒
boolean equals = calendarOld.equals(calendarNew); // 比较两个时间是否相等
System.out.println("equals=" + equals);
boolean before = calendarOld.before(calendarNew); // 比较A时间是否在B时间之前
System.out.println("before=" + before);
boolean after = calendarOld.after(calendarNew); // 比较A时间是否在B时间之后
System.out.println("after=" + after);
// 比较A时间与B时间的先后关系。
// 返回-1表示A较早,返回0表示二者相等,返回1表示B较早
int compareResult = calendarOld.compareTo(calendarNew);
System.out.println("compareResult=" + compareResult);
}
2.2 日历工具的常见应用
2.2.1 Calendar类型和Date类型互相转换
运用Calendar的getTime方法和setTime方法,其中getTime方法的返回值是Date类型的实例,而setTime方法的输入参数则为Date实例。
// 把Calendar类型的数据转换为Date类型
private static void convertCalendarToDate() {
Calendar calendar = Calendar.getInstance(); // 创建一个日历实例
Date date = calendar.getTime(); // 调用日历实例的getTime方法,获得日期信息
System.out.println("日历转日期 date=" + date.toString() + ", calendar=" + calendar.toString());
}
// 把Date类型的数据转换为Calendar类型
private static void convertDateToCalendar() {
Calendar calendar = Calendar.getInstance(); // 创建一个日历实例
Date date = new Date(); // 创建一个日期实例
calendar.setTime(date); // 调用日历实例的setTime方法,设置日期信息
System.out.println("日期转日历 date=" + date.toString() + ", calendar=" + calendar.toString());
}
2.2.2 计算两个日历时间之间的天数
计算两个日历时间之间的天数,在业务中很常见,例如:信用卡还款日期的提前提醒、网站账号隔若干天就要重新登录等等。
这时需用到Calendar的getTimeInMillis方法,该方法返回的是毫秒计量的时间总数。
// 计算两个日历实例间隔的天数
private static void countDays() {
Calendar calendarA = Calendar.getInstance(); // 创建一个日历实例
calendarA.set(2019, 3, 15); // 设置第一个日历实例的年月日
Calendar calendarB = Calendar.getInstance(); // 创建一个日历实例
calendarB.set(2019, 9, 15); // 设置第二个日历实例的年月日
long timeOfA = calendarA.getTimeInMillis(); // 获得第一个日历实例包含的时间总数(单位毫秒)
long timeOfB = calendarB.getTimeInMillis(); // 获得第二个日历实例包含的时间总数(单位毫秒)
// 先计算二者的差额,再把毫秒计量的差额转换为天数
long dayCount = (timeOfB - timeOfA) / (1000 * 60 * 60 * 24);
System.out.println("dayCount=" + dayCount);
}
2.2.3. 打印当前月份的月历
月历中NI年月星期都是明确的,唯有月末的日子是变化的,为了更简单的确定月末的最后一天,Calendar提供了getActualMaximum方法,该方法用于获得指定时间单位的最大合法值,如果指定的时间单位是Calenda.DATE,则返回的是当月的最后一天,代码如下:
int lastDay = calendar.getActualMaximum(Calendar.DATE); // 获取当月的最后一天
这下月历的所有要素都齐全了,包括当前年份、当前月份、当月1号、当月最后一天,再把中间的日子分星期依次排列即可。
// 打印当前月份的月历
private static void printMonthCalendar() {
Calendar calendar = Calendar.getInstance(); // 创建一个日历实例
calendar.set(Calendar.DATE, 1); // 设置日期为当月1号
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); // 获得该日期对应的星期几
dayOfWeek = dayOfWeek == 1 ? 7 : dayOfWeek - 1;
int lastDay = calendar.getActualMaximum(Calendar.DATE); // 获取当月的最后一天
// 拼接月历开头的年月
String yearAndMonth = String.format("\n%21s%d年%d月", "",
calendar.get(calendar.YEAR), calendar.get(calendar.MONTH) + 1);
System.out.println(yearAndMonth);
System.out.println(" 星期一 星期二 星期三 星期四 星期五 星期六 星期日");
for (int i = 1; i < dayOfWeek; i++) {
// 先补齐1号前面的空白
System.out.printf("%7s", "");
}
for (int i = 1; i <= lastDay; i++) {
// 循环打印从一号到本月最后一天的日子
String today = String.format("%7d", i);
System.out.print(today);
if ((dayOfWeek + i - 1) % 7 == 0) {
// 如果当天是星期日,末尾就另起一行
System.out.println();
}
}
}