日 期 时 间

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();
			}
		}
	}

猜你喜欢

转载自blog.csdn.net/weixin_46312449/article/details/110674484