10.11-Java中的时间与日期

Date类(java.util.Date)

该类的每一个实例用来描述时间(只能描述,不能操作)

其内部维护了一个long值。记录值自1970年1月1日到当前时间的毫秒差

例子

package day10_11;

import java.util.Date;

public class DateDemo {
	/**
	 * Date类在设计上存在两个问题
	 * 1.时区
	 * 2.千年虫(计算机处理时间的BUG)
	 */
	public static void main(String[] args) {
		/*
		 * 无参构造器 Date()
		 * 该构造器创建出的对象默认表示当前系统时间
		 */
		Date now = new Date();
		System.out.println(now);
		/*
		 * long getTime()
		 * 获取当前date对象描述的时间距离1970年1月1日的毫秒差
		 */
		long ms = now.getTime();
		System.out.println(ms);
		//计算明天这一刻的毫秒值
		ms+=24*60*60*1000;
		/*
		 * 有参构造器 Date(long time)
		 * 创建一个date对象来描述给定毫秒值所表示的时间
		 */
		Date td = new Date(ms);
		System.out.println(td);
		/*
		 * void setTime(long time)
		 * 使当前Date对象描述给定毫秒值所表示的时间
		 */
		now.setTime(ms);
		System.out.println(now);
	}
}

SimpleDateFormat类

使用一个特殊的字符串来描述一个时间格式

并使用该时间格式作为桥梁再Date与String相互转换

Date<--SimpleDateFormat(桥梁类)-->String类

时间格式字符串中使用的特殊字符

  • y 表示年份

    • yy两位数年份

    • yyyy 四位数年份

  • M 表示月

    • MM表示两位数的月份

  • d 表示日

    • dd 表示两位数的日期

  • h 表示小时(12小时制)

  • H 表示小时(24小时制)

    • hh/HH表示两位数的小时

  • m 表示分钟

    • mm表示两位数的分钟

  • s 表示秒

    • ss表示两位数的秒

  • E 表示星期

  • a 表示上下午

注意:在一个时间格式容器中出现的其他字符按意愿来显示

例子一:Date对象转换为字符串

package day10_11;

import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatDemo {
	
	public static void main(String[] args) {
		Date now = new Date();
		System.out.println(now);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年mm月dd日 HH时mm分ss秒 E a");
		/*
		 * String format(Date date)
		 * 将给定的date对象描述的时间按照指定的时间格式转换为字符串
		 */
		String str = sdf.format(now);
		System.out.println(str);
	}
}

例子二:字符串转换为Date对象

package day10_11;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatDemo02 {
	public static void main(String[] args) throws ParseException {
		String str = "2008-08-08 20:08:08";
		SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		/*
		 * Date parse(String str)
		 * 将给定的字符串按指定日期格式解析成对应的Date对象
		 */
		Date date = sdf.parse(str);
		System.out.println(date);
		
		
	}
}

DateFormat类

该类可以根据给定的地区将Date转换为String

不同的地区对应的时间格式字符串是预定义的

例子

package day10_11;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class DateFormatDemo {
	public static void main(String[] args) {
		Date now = new Date();
		System.out.println(now);
//		DateFormat df = new DateFormat();
		/*
		 * 创建DateDormat类型的实例使用其自身提供的工厂方法
		 * getDateInstance()
		 * style:打印时间的样式
		 * aLocale:
		 */
		DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, Locale.ENGLISH);
		String str = df.format(now);
		System.out.println(str);
	}
}

Calendar类

日历类,用于操作时间

Calendar类是一个抽象类,不能直接实例化

使用其自身提供的工厂方法getInstance()来获取实例

该方法会根据当前系统所在地区,自动判定应该使用哪一个子类实现

例子

package day03;

import java.util.Calendar;
import java.util.Date;

public class CalendarDemo01 {
	public static void main(String[] args) {
		//通过工厂方法获取Calendar类型的实例
		Calendar calendar = Calendar.getInstance();
		//格林高利历法(阳历)
//		Calendar calendar = new GregorianCalendar();
		//默认情况下创建出来的Calendar对象表示当前的系统时间
		System.out.println(calendar);
		/*
		 * 查看calendar时间,通过输出该对象得到的
		 * 字符串不友好,可以先将Calendar转换为Date
		 * Date getTime()
		 * 将当前Calendar对象描述的时间转换
		 * 为一个Date对象并返回
		 */
		Date date = calendar.getTime();
		System.out.println(date);
		long ms = date.getTime();
		System.out.println(ms);
		//计算明天这一刻的毫秒值
		ms+=24*60*60*1000;
		date.setTime(ms);
		System.out.println(date);
		/*
		 * void setTime(Date date)
		 * 使当前Calendar对象描述给定Date
		 * 对象所表示的时间
		 */
		calendar.setTime(date);
		System.out.println(calendar);
	}
}

操作时间的方式

获取某个时间单位的值(get)

给某个时间单位设置值(set)

计算时间 (add)

例子-获取某个时间单位的值(get)

package day03;

import java.util.Calendar;

public class CalendarDemo02 {
	//获取某个时间单位的值
	public static void main(String[] args) {
		Calendar calendar = Calendar.getInstance();
		/*
		 * int get(int field)
		 * field该参数对应Calendar提供的若干常量,
		 * 每一个常量就表示一个不同的时间单位
		 */
		//获取年份
		int year = calendar.get(Calendar.YEAR);
		System.out.println(year);
		//获取月份
		int month = calendar.get(Calendar.MONTH);
		//月份从0开始算起,0表示1月
		System.out.println(month);//9
		/*
		 * 对于天而言有以下中时间分量:
		 * Calendar.DATE            几号
		 * Calendar.DAY_OF_MONTH    月中天
		 * Calendar.DAY_OF_WEEK     周中天
		 * Calendar.DAY_OF_YEAR     年中天
		 */
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		System.out.println(day);
		/*
		 * 对于星期而言符合美国习惯:
		 * 周日为一周的第一天
		 */
		int dow = calendar.get(Calendar.DAY_OF_WEEK);
		System.out.println("星期"+(dow==1?7:dow-1));
		int td = calendar.get(Calendar.WEEK_OF_MONTH);
		System.out.println(td);
	}
}

例子-给某个时间单位设置值(set)

package day03;

import java.util.Calendar;

public class CalendarDemo03 {
	//给某个时间单位设置值
	public static void main(String[] args) {
		Calendar calendar = Calendar.getInstance();
		/*
		 * void set(int field,int value)
		 * 将给定的时间单位设置给定的值
		 */
		//设置年份为2008年
		calendar.set(Calendar.YEAR,2008);
		//设置月份为8月,月份从0算起
//		calendar.set(Calendar.MONTH,7);
		calendar.set(Calendar.MONTH,Calendar.AUGUST);
		//设置日期为8号
//		calendar.set(Calendar.DAY_OF_MONTH,8);
		/*
		 * 当给定的时间分量对应的值超出当前时间
		 * 分量所允许的最大值时,会自动进位
		 */
		calendar.set(Calendar.DAY_OF_MONTH,32);
		System.out.println(calendar.getTime());
	}
}

例子-计算时间 (add)

package day03;

import java.util.Calendar;

public class CalendarDemo04 {
	//计算时间
	public static void main(String[] args) {
		//计算该月的月底:下个月的1号减去1天
		Calendar calendar = Calendar.getInstance();
		/*
		 * void add(int field,int value)
		 * 将给定的时间分量累加给定的值
		 */
		//将月份往后推1个月
		calendar.add(Calendar.MONTH,1);
		//将日期设置为1号
		calendar.set(Calendar.DATE,1);
		//将天往前推1天
		calendar.add(Calendar.DAY_OF_MONTH,-1);
		System.out.println(calendar.getTime());
	}
}

综合练习

计算商品的促销日期:
  
* 1.在控制台输入商品的生产日期(yyyy-MM-dd)
* 2.在控制台输入商品的保质期天数
* 3.计算促销日期:(yyyy-MM-dd),促销日期是商品到期日的那一个星期的前两个星期的星期三
package day03;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;

public class CalendarDemo05 {
	/**
	 * 计算商品的促销日期:
	 * 1.在控制台输入商品的生产日期(yyyy-MM-dd)
	 * 2.在控制台输入商品的保质期天数
	 * 3.计算促销日期:(yyyy-MM-dd)
	 *   是商品到期日的那一个星期的前两个星期的星期三
	 * @throws ParseException 
	 */
	public static void main(String[] args) throws ParseException {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入商品的生产日期:");
		String proString = sc.nextLine();
		Scanner s = new Scanner(System.in);
		System.out.println("请输入商品的保质期天数:");
		int days = s.nextInt();
		//将String类型的生产日期转换为Calendar类型
		SimpleDateFormat sdf = 
			new SimpleDateFormat("yyyy-MM-dd");
		Date proDate = sdf.parse(proString);
		Calendar proCalendar = Calendar.getInstance();
		proCalendar.setTime(proDate);
		//求商品的到期日
		proCalendar.add(Calendar.DAY_OF_YEAR,days);
		//将星期数往前推2周(将天数往前推14天)
		proCalendar.add(Calendar.WEEK_OF_YEAR,-2);
//		proCalendar.add(Calendar.DAY_OF_YEAR,-14);
		//将星期数设置为周三
		proCalendar.set(Calendar.DAY_OF_WEEK,Calendar.WEDNESDAY);
		//将Calendar类型的促销日期转换为String
		proDate = proCalendar.getTime();
		proString = sdf.format(proDate);
		System.out.println("促销日期:"+proString);
	}
}

总结

String/Date/Calendar三者之间的关系

String->SimpleDateFormat.parse()->Date

Date->Calendar.setTime()->Calendar

Calendar->Calendar.getTime()->Date

Date->SimpleDateFormat.parse()->String

最后更新于