精华内容
下载资源
问答
  • 8、Java基础---创建日期类

    千次阅读 2019-09-15 19:39:51
    创建日期类 一、日期类 日期是通过年、月、日这三项来表示的。我们来创建一个日期类,将这些项定义为int型字段;如果将类命名为Day, 只考虑字段的话,可以像下面这样进行声明;类Day的内容如图所示: 将所有的...

    创建日期类

    一、日期类

    日期是通过年、月、日这三项来表示的。我们来创建一个日期类,将这些项定义为int型字段;如果将类命名为Day, 只考虑字段的话,可以像下面这样进行声明;类Day的内容如图所示:

    将所有的字段都设为私有(private) 外部访问可以通过构造函数和方法间接执行。

    二、构造函数和方法

    构造函数是在创建实例时为了正确进行初始化而设置的控件;类Day的构造函数的定义如下所示,形参中接收到的三个整数值直接赋给了各个字段;

    为了访问与形参同名的字段,这里使用了this,如果不使用this, 则会变成:

    在创建类Day类型的实例时,要传递给该构造函数三个int型的参数,如下所示:

    Day birthday = new Day(1963, 11, 18);

    启动构造函数时,birthday的字段year、manth、date就会被分别赋入1963 、11 、18;创建完构造函数后,下面创建如下所示的方法:

    class Day {
    	private int year;			// 年
    	private int month;			// 月
    	private int date;			// 日
    
    	//--- 构造函数 ---//
    	Day(int year, int month, int date) {
    		this.year  = year;		// 年	
    		this.month = month;		// 月
    		this.date  = date;		// 日
    	}
    
    	//--- 获取年、月、日 ---//
    	int getYear()  { return year; }		// 获取年
    	int getMonth() { return month; }	// 获取月
    	int getDate()  { return date; }		// 获取日
    
    	//--- 设置年、月、日 ---//
    	void setYear(int year)   { this.year  = year; }		// 设置年
    	void setMonth(int month) { this.month = month; }	// 设置月
    	void setDate(int date)   { this.date  = date; }		// 设置日
    
    	void set(int year, int month, int date) {			// 设置年月日
    		this.year  = year;			// 年	
    		this.month = month;			// 月
    		this.date  = date;			// 日
    	}
    
    	//--- 计算星期 --//
    	int dayOfWeek() {
    		int y = year;					// 0 … 星期日
    		int m = month;					// 1 … 星期一
    		if (m == 1 || m == 2) {			//  :
    			y--;						// 5 … 星期五
    			m += 12;					// 6 … 星期六
    		}
    		return (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + date) % 7;
    	}
    }
    

    方法dayOfWeek会计算并返回星期的整数值如果是星期日,则返回值为0; 如果是星期一则返回值为1; 以此类推,如果是星期六则返回值为6。

    三、访问器

    //--- 获取年、月、日 ---//
    	int getYear()  { return year; }		// 获取年
    	int getMonth() { return month; }	// 获取月
    	int getDate()  { return date; }		// 获取日
    
    	//--- 设置年、月、日 ---//
    	void setYear(int year)   { this.year  = year; }		// 设置年
    	void setMonth(int month) { this.month = month; }	// 设置月
    	void setDate(int date)   { this.date  = date; }		// 设置日

     

    用于获取字段值的方法称为getter方法,用于设置字段值的方法称为setter方法,两者统称为访问器; 

    使用类Day的程序示例:

    import java.util.Scanner;
    
    class DayTester {
    
    	public static void main(String[] args) {
    		Scanner stdIn = new Scanner(System.in);
    		String[] wd = {"日", "一", "二", "三", "四", "五", "六"};
    
    		System.out.println("请输入阳历生日。");
    		System.out.print("年:");  int y = stdIn.nextInt();
    		System.out.print("月:");  int m = stdIn.nextInt();
    		System.out.print("日:");  int d = stdIn.nextInt();
    
    		Day birthday = new Day(y, m, d);
    
    		System.out.println("你的生日"
    							 + birthday.getYear()  + "年"
    							 + birthday.getMonth() + "月"
    							 + birthday.getDate()  + "日是星期"
    							+ wd[birthday.dayOfWeek()] + "。");
    	}
    }
    

    输出:

    四、类类型变量的赋值

    // 类类型变量的赋值
    class DayAssign {
        public static void main(String[] args) {
            Scanner stdIn = new Scanner(System.in);
            String[] wd = {"日", "一", "二", "三", "四", "五", "六"};
            System.out.println("请输入阳历生日。");
            System.out.print("年:");  int y = stdIn.nextInt();
            System.out.print("月:");  int m = stdIn.nextInt();
            System.out.print("日:");  int d = stdIn.nextInt();
            Day birthday = new Day(y, m, d);
            System.out.println("你的生日"
                    + birthday.getYear()  + "年"
                    + birthday.getMonth() + "月"
                    + birthday.getDate()  + "日是星期"
                    + wd[birthday.dayOfWeek()] + "。");
            Day xDay = birthday;
            xDay.set(2100, 12, 31);		// 设置为2100年12月31日
            System.out.println("birthday = "
                    + birthday.getYear()  + "年"
                    + birthday.getMonth() + "月"
                    + birthday.getDate()  + "日("
                    + wd[birthday.dayOfWeek()] + ")");
    
            System.out.println("xDay     = "
                    + xDay.getYear()  + "年"
                    + xDay.getMonth() + "月"
                    + xDay.getDate()  + "日("
                    + wd[xDay.dayOfWeek()] + ")");
        }
    }
    

    输出:

    在上述程序中,另外创建了一个Day类型的变量xDay,并将其设置为2100年12月3l日,但这样一来,本不应该被设置值的birday的日期也被改写了我们来分析一下原因:

     Day xDay = birthday;

    Day类型的变量xDay的声明,初始值birthday是类类型变量,是实例主体的引用。因此,xDay会被初始化为birthday实例的引用。最终,如图所示,遥控器birthday和xDay操作的对象(引用目标)实例是同一个实例。由于未调用函数, 因此肯定不会创建新的日期实例。

    xDay.set(2100, 12, 31);		// 设置为2100年12月31日

    中使用方法set将xDay的各个字段设置为2100、12 、31。对xDay引用的实例设置值其实就是修改原本为birthday创建的实例的值

    当将类类型的变量初始化或者赋值为同一类型的变量时,会复制引用目标,而不会复制所有字段的值。

    五、类类型变量的比较

    对类类型变量应用的相等运算符==和!=会判断引用目标是否相同, 而不会判断字段的值是否相等

    创建一个判断两个日期是否相等的程序:

    class DayComparator1 {
    	public static void main(String[] args) {
    		Scanner stdIn = new Scanner(System.in);
    		int y, m, d;
    		System.out.println("请输入日期1。");
    		System.out.print("年:");  y = stdIn.nextInt();
    		System.out.print("月:");  m = stdIn.nextInt();
    		System.out.print("日:");  d = stdIn.nextInt();
    		Day day1 = new Day(y, m, d);
    		System.out.println("请输入日期2。");
    		System.out.print("年:");  y = stdIn.nextInt();
    		System.out.print("月:");  m = stdIn.nextInt();
    		System.out.print("日:");  d = stdIn.nextInt();
    		Day day2 = new Day(y, m, d);
    		if (day1 == day2)
    			System.out.println("相等。");
    		else
    			System.out.println("不相等。");
    	}
    }

    输出:

    程序中的if语句会判断dayl和day2的引用目标是否相同。由于dayl和day2是分别创建的实例,因此它们的引用目标不相同,不管字段为何值,==运算符的结果永远都是false

    若要判断所有字段的值是否相等,就需要调用getter 方法,确认年、月、日, 正确的程序如下:

    class DayComparator2 {
    	public static void main(String[] args) {
    		Scanner stdIn = new Scanner(System.in);
    		int y, m, d;
    		System.out.println("请输入日期1。");
    		System.out.print("年:");  y = stdIn.nextInt();
    		System.out.print("月:");  m = stdIn.nextInt();
    		System.out.print("日:");  d = stdIn.nextInt();
    		Day day1 = new Day(y, m, d);
    		System.out.println("请输入日期2。");
    		System.out.print("年:");  y = stdIn.nextInt();
    		System.out.print("月:");  m = stdIn.nextInt();
    		System.out.print("日:");  d = stdIn.nextInt();
    		Day day2 = new Day(y, m, d);
    		if (day1.getYear() == day2.getYear() && day1.getMonth() == day2.getMonth()
    									 && day1.getDate()  == day2.getDate())
    			System.out.println("相等。");
    		else
    			System.out.println("不相等。");
    	}
    }
    

    输出:

    六、作为参数的类类型变量

    创建一个判断两个日期是否相等的方法,程序就会变得更加简洁,这样改良后的程序如下:

    class DayComparator3 {
    
    	//--- d1和d2的日期相等吗? ---//
    	static boolean compDay(Day d1, Day d2) {
    		return d1.getYear()  == d2.getYear() &&
    				 d1.getMonth() == d2.getMonth() &&
    				 d1.getDate()  == d2.getDate();
    	}
    
    	public static void main(String[] args) {
    		Scanner stdIn = new Scanner(System.in);
    
    		int y, m, d;
    		System.out.println("请输入日期1。");
    		System.out.print("年:");  y = stdIn.nextInt();
    		System.out.print("月:");  m = stdIn.nextInt();
    		System.out.print("日:");  d = stdIn.nextInt();
    		Day day1 = new Day(y, m, d);
    
    		System.out.println("请输入日期2。");
    		System.out.print("年:");  y = stdIn.nextInt();
    		System.out.print("月:");  m = stdIn.nextInt();
    		System.out.print("日:");  d = stdIn.nextInt();
    		Day day2 = new Day(y, m, d);
    
    		if (compDay(day1, day2))
    			System.out.println("相等。");
    		else
    			System.out.println("不相等。");
    	}
    }
    

    输出:

    方法compDay是在类Day的外部声明的,请注意如下3点:

    1)接收类类型的参数

    形参d1和d2是Day类型的类类型变量,如图所示这两个形参按收的是Day类型实例的引用。因此,d1会引用day1的实例,d2会引用day2的实例。

    2)声明中加上了static

    由于本方法定义在类Day的外部,因此它不属于各个实例(day1或day2),加上static进行声明的方法就是类方法。

    3)无法访问私有字段

    由于本方法定义在类Day的外部,因此无法直接访问日期的字段year、month、date。本方法中通过调用getter方法getYear、getMonth、getDate来确认年、月、日的值。

    if (compDay(day1, day2))

    调用方法compDay ,将dayl实例的引用和day2实例的引用作为实参传递给该方法;if语句中根据方法的boolean型返回值,会分别显示”相等” 或“不相等”。

    七、类类型实例的数组

    创建一个Day类型实例的数组,程序会创建一个数组, 其元素个数通过键盘输入,并将全部元素的日期都设置为2017年IO月15日, 然后将其显示出来。

    // 日期类Day的数组(运行时错误)
    
    import java.util.Scanner;
    
    class DayArrayError {
    
    	public static void main(String[] args) {
    		Scanner stdIn = new Scanner(System.in);
    		String[] wd = {"日", "一", "二", "三", "四", "五", "六"};
    
    		System.out.print("日期个数:");
    		int n = stdIn.nextInt();
    
    		Day[] a = new Day[n];			// 元素个数为n的Day类型数组
    
    		for (int i = 0; i < a.length; i++)
    			a[i].set(2017, 10, 15);		// 将全部元素都设置为2017年10月15日
    
    		for (int i = 0; i < a.length; i++)
    			System.out.println("a[" + i + "] = "
    									 + a[i].getYear()  + "年"
    									 + a[i].getMonth() + "月"
    									 + a[i].getDate()  + "日("
    									 + wd[a[i].dayOfWeek()] + ")");
    	}
    }
    

    输出:

    运行时.,在读入日期个数n之后就会发生运行时错误;

     Day[] a = new Day[n];			// 元素个数为n的Day类型数组

    上述代码已经为a创建了数组主体,那为什么还会发生错误呢?

    元素a[1]是引用Day的类类型变量(遥控器),不是日期的实例(主体) 当然、a[0] 和a[2] 也是如此

    数组a并不是日期主体的数组,而是3个遥控器的集合数组。创建数组时,各个元素会被初始化为null;

    for (int i = 0; i < a.length; i++)
                a[i].set(2017, 10, 15);		// 将全部元素都设置为2017年10月15日

    上述执行会发生错误,因为此处对无任何引用的空引用a[i]调用了方法set。对于各个日期实例, 在类类型变量之外,还需要再使用new运算符来另外创建; 正确的程序如下所示:

    for (int i = 0; i < a.length; i++)
    a[i] = new Day(2017, 10, 15); 

    输出:为了使用类类型实例的数组,必须在创建类类型变量的数组的基础上,再创建各个元素的实例。

    将for语句的执行内容展开后如图所示,每次循环时都会创建Day类型实例,并将其初始化为2017年10月15日。然后,使用赋值运符符将创建的实例的引用赋给a[i].。

    八、日期类的改进

    创建了使用日期类的程序,但该程序中还存在不少的问题:
    1)由于构造函数中需要三个int型参数,因此在创建实例时缺乏灵活性。 例如,在创建数组时就不可以 “不直接设性值,而先创建元素,然后再设置值”;
    2)不易于构建与某个日期相同的日期实例;
    3)不易于判断两个日期是否相等;
    4)显示日期时需要3~4行的程序。

    修改后代码如下:

    public class Day {
    	private int	year;		// 年
    	private int	month;		// 月
    	private int	date;		// 日
    
    	//--- 构造函数 ---//
    	public Day()                              { set(1, 1, 1); }
    	public Day(int year)                      { set(year, 1, 1); }
    	public Day(int year, int month)           { set(year, month, 1); }
    	public Day(int year, int month, int date) { set(year, month, date); }
    	public Day(Day d)                         { set(d.year, d.month, d.date); }
    
    	//--- 获取年、月、日 ---//
    	public int getYear()  { return year; }	// 年
    	public int getMonth() { return month; }	// 月
    	public int getDate()  { return date; }	// 日
    
    	//--- 设置年、月、日 ---//
    	public void setYear(int year)   { this.year  = year; }	// 年
    	public void setMonth(int month) { this.month = month; }	// 月
    	public void setDate(int date)   { this.date  = date; }	// 日
    
    	public void set(int year, int month, int date) {		// 年月日
    		this.year  = year;			// 年	
    		this.month = month;			// 月
    		this.date  = date;			// 日
    	}
    
    	//--- 计算星期 ---//
    	public int dayOfWeek() {
    		int y = year;					// 0 … 星期日
    		int m = month;					// 1 … 星期一
    		if (m == 1 || m == 2) {		    //  :
    			y--;						// 5 … 星期五
    			m += 12;					// 6 … 星期六
    		}
    		return (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + date) % 7;
    	}
    
    	//--- 与日期d相等吗 ---//
    	public boolean equalTo(Day d) {
    		return year == d.year && month == d.month && date == d.date;
    	}
    
    	//--- 返回字符串表示 ---//
    	public String toString() {
    		String[] wd = {"日", "一", "二", "三", "四", "五", "六"};
    		return String.format("%04d年%02d月%02d日(%s)", 
    								year, month, date, wd[dayOfWeek()]);
    	}
    }
    

    1)public类

    类的声明中加上了public。根据有无public, 类的访问属性有如下不同:

    2)构造函数

    木程序重载了从不接收年、月、日的构造函数到接收全部的构造函数在内的共5种构造函数。
    与方法一样, 构造函数也可以重载,提供了多个构造函数后,对于类的使用者来说、构建类实例的选择范围就比较广了。

    各个构造函数的初始化如下所示, 不接收参数的项设为1:

    所有的构造函数内部都调用了方法set,同一个类中的方法可以使用“方法名(...) " 的形式进行调用;通过重载构造函数, 我们就可以解决前面提到的问题1和问题2。

    问题1
    将日期设置为1年1月l日的构造函数不接收参数, 因此、之前的类Day中会发生错误的如下代码就可以正常运行了

    for (int i = 0; i < a.length; i++)
    a [i] = new Day () ;
    for (inti = 0; i < a.length; i++)
    a[i].set(2017, 10, 15);

    由于可以先创建实例` 然后再设置值, 因此可以很灵活地创建数组。

    问题2
    构造函数的参数d的类型为Day,通过复制接收到的日期d的字段d.year、d.month、d.date的值, 来初始化日期;这个构造函数的动作如图, dayl的字段值会被复制到对应的day2的各个字段中。

     

    问题3  equalTo…判断是否相等的方法

    equal To 方法用于判断日期是否相等,将自身的日期和参数d中接收的日期进行比较。如果年、月、日都相等, 则返回true, 否则返回false。与比较引用目标的相等运算符==不同, equal To方法比较的是所有字段的值是否相等。

    问题4 toString… 返回字符串表示的方法

    to String方法用来返回日期的字符串表示,返回的字符串中,年的部分是4位,月和日的部分是2位. 形式为"2010年05月04 (五),创建字符串时使用的是String.format方法,可以将其理解成一种将System.out.printf在画面上的输出转换为字符串的方法。

    class DayTester {
    
    	public static void main(String[] args) {
    		Scanner stdIn = new Scanner(System.in);
    
    		System.out.println("请输入day1。");
    		System.out.print("年:");  int y = stdIn.nextInt();
    		System.out.print("月:");  int m = stdIn.nextInt();
    		System.out.print("日:");  int d = stdIn.nextInt();
    
    		Day day1 = new Day(y, m, d);	// 读入日期
    		System.out.println("day1 = " + day1);
    
    		Day day2 = new Day(day1);		// 与day1相同的日期
    		System.out.println("创建了与day1的日期相同的day2。");
    		System.out.println("day2 = " + day2);
    
    		if (day1.equalTo(day2))
    			System.out.println("day1和day2相等。");
    		else
    			System.out.println("day1和day2不相等。");
    
    		Day d1 = new Day();					//    1年 1月 1日
    		Day d2 = new Day(2010);				// 2010年 1月 1日
    		Day d3 = new Day(2010, 10);			// 2010年10月 1日
    		Day d4 = new Day(2010, 10, 15);		// 2010年10月15日
    
    		System.out.println("d1   = " + d1);
    		System.out.println("d2   = " + d2);
    		System.out.println("d3   = " + d3);
    		System.out.println("d4   = " + d4);
    
    		Day[] a = new Day[3];			// 元素个数为3的Day类型数组
    		for (int i = 0; i < a.length; i++)
    			a[i] = new Day();			// 将全部元素都设置为1年1月1日
    
    		for (int i = 0; i < a.length; i++)
    			System.out.println("a[" + i + "] = " + a[i]);
    	}
    }
    

    输出:

    改进终版:

    public class Day {
    	private int	year	= 1;	// 年
    	private int	month = 1;		// 月
    	private int	date 	= 1;	// 日
    
    	//-- 构造函数 --//
    	public Day()                              { }
    	public Day(int year)                      { this.year = year; }
    	public Day(int year, int month)           { this(year); this.month = month; }
    	public Day(int year, int month, int date) { this(year, month); this.date = date; }
    	public Day(Day d)                         { this(d.year, d.month, d.date); }
    
    	//--- 获取年、月、日 ---//
    	public int getYear()  { return year; }	// 获取年
    	public int getMonth() { return month; }	// 获取月
    	public int getDate()  { return date; }	// 获取日
    
    	//--- 设置年、月、日 ---//
    	public void setYear(int year)   { this.year  = year; }	// 设置年
    	public void setMonth(int month) { this.month = month; }	// 设置月
    	public void setDate(int date)   { this.date  = date; }	// 设置日
    
    	public void set(int year, int month, int date) {		// 设置年月日
    		this.year  = year;			// 年	
    		this.month = month;			// 月
    		this.date  = date;			// 日
    	}
    
    	//--- 计算星期 ---//
    	public int dayOfWeek() {
    		int y = year;				// 0 … 星期日
    		int m = month;				// 1 … 星期一
    		if (m == 1 || m == 2) {		//  :
    			y--;					// 5 … 星期五
    			m += 12;				// 6 … 星期六
    		}
    		return (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + date) % 7;
    	}
    
    	//--- 与日期d相等吗 ---//
    	public boolean equalTo(Day d) {
    		return year == d.year && month == d.month && date == d.date;
    	}
    
    	//--- 返回字符串表示---//
    	public String toString() {
    		String[] wd = {"日", "一", "二", "三", "四", "五", "六"};
    		return String.format("%04d年%02d月%02d日(%s)", 
    								year, month, date, wd[dayOfWeek()]);
    	}
    }
    

     

    展开全文
  • 一、Java中的日期概述日期在Java...在Java中,操作日期主要涉及到一下几个:1、java.util.Date Date 表示特定的瞬间,精确到毫秒。从 JDK 1.1 开始,应该使用 Calendar 实现日期和时间字段之间转换,使用 Date...

    一、Java中的日期概述

    日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式都是非常复杂的问题。

    在Java中,操作日期主要涉及到一下几个类:

    1、java.util.Date

    类 Date 表示特定的瞬间,精确到毫秒。从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和分析日期字符串。Date 中的把日期解释为年、月、日、小时、分钟和秒值的方法已废弃。

    2、java.text.DateFormat(抽象类)

    DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并分析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(日期 -> 文本)、分析(文本-> 日期)和标准化。将日期表示为 Date 对象,或者表示为从 GMT(格林尼治标准时间)1970 年1 月 1 日 00:00:00 这一刻开始的毫秒数。

    3、java.text.SimpleDateFormat(DateFormat的直接子类)

    SimpleDateFormat 是一个以与语言环境相关的方式来格式化和分析日期的具体类。

    SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。但是,仍然建议通过 DateFormat 中的 getTimeInstance、getDateInstance 或 getDateTimeInstance 来新的创建日期-时间格式化程序。

    4、java.util.Calendar(抽象类)

    Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

    与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化。

    5、java.util.GregorianCalendar(Calendar的直接子类)

    GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家使用的标准日历系统。

    GregorianCalendar 是一种混合日历,在单一间断性的支持下同时支持儒略历和格里高利历系统,在默认情况下,它对应格里高利日历创立时的格里高利历日期(某些国家是在 1582 年 10 月 15 日创立,在其他国家要晚一些)。可由调用方通过调用 setGregorianChange() 来更改起始日期。

    二、java.util.Date的使用

    1、java.util.Date的API简介

    类 java.util.Date 表示特定的瞬间,精确到毫秒。

    1)构造方法:

    Date() :分配 Date 对象并用当前时间初始化此对象,以表示分配它的时间(精确到毫秒)。

    Date(long date) :分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。

    2)方法摘要

    boolean after(Date when) :测试此日期是否在指定日期之后。

    boolean before(Date when) :测试此日期是否在指定日期之前。

    Object clone() :返回此对象的副本。

    int compareTo(Date anotherDate) :比较两个日期的顺序。

    boolean equals(Object obj) :比较两个日期的相等性。

    long getTime() :返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

    int hashCode() :返回此对象的哈希码值。

    void setTime(long time) :设置此 Date 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点。

    String toString() :把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中:

    dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。

    mon 是月份 (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)。

    dd 是一月中的某一天(01 至 31),显示为两位十进制数。

    hh 是一天中的小时(00 至 23),显示为两位十进制数。

    mm 是小时中的分钟(00 至 59),显示为两位十进制数。

    ss 是分钟中的秒数(00 至 61),显示为两位十进制数。

    zzz 是时区(并可以反映夏令时)。标准时区缩写包括方法 parse 识别的时区缩写。如果不提供时区信息,则 zzz 为空,即根本不包括任何字符。

    yyyy 是年份,显示为 4 位十进制数。

    2、java.text.DateFormat抽象类的使用

    DateFormat 提供了很多类方法,以获得基于默认或给定语言环境和多种格式化风格的默认日期/时间 Formatter。格式化风格包括 FULL、LONG、MEDIUM 和 SHORT。方法描述中提供了使用这些风格的更多细节和示例。

    DateFormat 可帮助进行格式化并分析任何语言环境的日期。对于月、星期,甚至日历格式(阴历和阳历),其代码可完全与语言环境的约定无关。

    要格式化一个当前语言环境下的日期,可使用某个静态工厂方法: myString = DateFormat.getDateInstance().format(myDate);

    如果格式化多个日期,那么获得该格式并多次使用它是更为高效的做法,这样系统就不必多次获取有关环境语言和国家约定的信息了。

    DateFormat df = DateFormat.getDateInstance();

    for (int i = 0; i < myDate.length; ++i) {

    output.println(df.format(myDate[i]) + "; "); }

    要格式化不同语言环境的日期,可在 getDateInstance() 的调用中指定它。DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE); 还可使用 DateFormat 进行分析。myDate = df.parse(myString);

    使用 getDateInstance 来获得该国家的标准日期格式。使用 getTimeInstance 可获得该国家的时间格式。使用 getDateTimeInstance 可获得日期和时间格式。可以将不同选项传入这些工厂方法,以控制结果的长度(从 SHORT 到 MEDIUM 到 LONG 再到 FULL)。确切的结果取决于语言环境,但是通常:

    SHORT 完全为数字,如 12.13.52 或 3:30pm

    MEDIUM 较长,如 Jan 12, 1952

    LONG 更长,如 January 12, 1952 或 3:30:32pm

    FULL 是完全指定,如 Tuesday, April 12, 1952 AD 或 3:30:42pm PST。

    如果愿意,还可以在格式上设置时区。如果想对格式化或分析施加更多的控制(或者给予用户更多的控制),可以尝试将从工厂方法所获得的 DateFormat 强制转换为 SimpleDateFormat。这适用于大多数国家;只是要记住将其放入一个 try 代码块中,以防遇到特殊的格式。 还可以使用借助 ParsePosition 和 FieldPosition 的分析和格式化方法形式来:逐步地分析字符串的各部分。对齐任意特定的字段,或者找出字符串在屏幕上的选择位置。

    DateFormat 不是同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问一个格式,则它必须保持外部同步。

    3、java.text.SimpleDateFormat(DateFormat的直接子类)的使用

    SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。但是,仍然建议通过 DateFormat 中的 getTimeInstance、getDateInstance 或 getDateTimeInstance 来新的创建日期-时间格式化程序。每一个这样的类方法都能够返回一个以默认格式模式初始化的日期/时间格式化程序。可以根据需要使用 applyPattern 方法来修改格式模式。

    1)日期和时间模式

    日期和时间格式由日期和时间模式字符串指定。在日期和时间模式字符串中,未加引号的字母 'A' 到 'Z' 和 'a' 到 'z' 被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (') 引起来,以免进行解释。"''" 表示单引号。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在分析时与输入字符串进行匹配。

    定义了以下模式字母(所有其他字符 'A' 到 'Z' 和 'a' 到 'z' 都被保留):

    G:Era标志符;y:年;M:年中的月份;w:年中的周数;W:月份中的周数;D:年中的天数;d:月份中的天数;F:月份中的星期;;E:星期中的天数;a:Am/pm 标记;H:一天中的小时数(0-23);k:一天中的小时数(1-24);K:am/pm 中的小时数(0-11);h:am/pm 中的小时数(1-12);m:小时中的分钟数;s:分钟中的秒数;S:毫秒数;z:时区;Z:时区

    2)举例

    Date date = new Date();

    //创建不同的日期格式

    DateFormat df1 = DateFormat.getInstance();

    DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EE");

    DateFormat df3 = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA); //产生一个指定国家指定长度的日期格式,长度不同,显示的日期完整性也不同

    DateFormat df4 = new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒 EE", Locale.CHINA);

    DateFormat df5 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EEEEEE", Locale.US);

    DateFormat df6 = new SimpleDateFormat("yyyy-MM-dd");

    DateFormat df7 = new SimpleDateFormat("yyyy年MM月dd日");

    //将日期按照不同格式进行输出

    System.out.println("按照Java默认的日期格式,默认的区域 : " + df1.format(date));

    System.out.println("按照指定格式 yyyy-MM-dd hh:mm:ss EE ,系统默认区域 :" + df2.format(date));

    System.out.println("按照日期的FULL模式,区域设置为中文 : " + df3.format(date));

    System.out.println("按照指定格式 yyyy年MM月dd日 hh时mm分ss秒 EE ,区域为中文 : " + df4.format(date));

    System.out.println("按照指定格式 yyyy-MM-dd hh:mm:ss EE ,区域为美国 : " + df5.format(date));

    System.out.println("按照指定格式 yyyy-MM-dd ,系统默认区域 : " + df6.format(date));

    结果:

    按照Java默认的日期格式,默认的区域 : 07-11-30 下午5:04

    按照指定格式 yyyy-MM-dd hh:mm:ss EE ,系统默认区域 :2007-11-30 05:04:10 星期五

    按照日期的FULL模式,区域设置为中文 : 2007年11月30日 星期五

    按照指定格式 yyyy年MM月dd日 hh时mm分ss秒 EE ,区域为中文 : 2007年11月30日 05时04分10秒星期五

    按照指定格式 yyyy-MM-dd hh:mm:ss EE ,区域为美国 : 2007-11-30 05:04:10 Friday

    按照指定格式 yyyy-MM-dd ,系统默认区域 : 2007-11-30

    4、java.util.Calendar(抽象类)

    一个Calendar的实例是系统时间的抽象表示,从Calendar的实例可以知道年月日星期月份时区等信息。Calendar类中有一个静态方法 get(int x),通过这个方法可以获取到相关实例的一些值(年月日星期月份等)信息。参数x是一个产量值,在Calendar中有定义。

    1)Calendar的星期是从周日开始的,常量值为0。

    2)Calendar的月份是从一月开始的,常量值为0。

    3)Calendar的每个月的第一天值为1。

    5、java.util.GregorianCalendar(Calendar的直接子类)

    GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家使用的标准日历系统。结合Calendar抽象类使用。

    举例:

    //创建Calendar的方式

    Calendar now = new GregorianCalendar(2007, 10, 30, 15, 55, 44);

    //定义日期的中文输出格式,并输出日期

    SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒 E", Locale.CHINA);

    System.out.println("获取日期中文格式化化输出:" + df.format(now.getTime()));

    System.out.println("获取年:" + now.get(Calendar.YEAR));

    System.out.println("获取月(月份是从0开始的):" + now.get(Calendar.MONTH));

    System.out.println("获取日:" + now.get(Calendar.DAY_OF_MONTH));

    System.out.println("获取时:" + now.get(Calendar.HOUR));

    System.out.println("获取分:" + now.get(Calendar.MINUTE));

    System.out.println("获取秒:" + now.get(Calendar.SECOND));

    System.out.println("获取上午、下午:" + now.get(Calendar.AM_PM));

    System.out.println("获取星期数值(星期是从周日开始的):" + now.get(Calendar.DAY_OF_WEEK));

    String dayOfWeek[] = {"", "日", "一", "二", "三", "四", "五", "六"};

    System.out.println("now对象的星期是:" + dayOfWeek[now.get(Calendar.DAY_OF_WEEK)]);

    String months[] = {"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"};

    System.out.println("now对象的月份是: " + months[now.get(Calendar.MONTH)]);

    结果:

    获取日期中文格式化化输出:2007年11月30日 03时55分44秒 星期五

    获取年:2007

    获取月(月份是从0开始的):10

    获取日:30

    获取时:3

    获取分:55

    获取秒:44

    获取上午、下午:1

    获取星期数值(星期是从周日开始的):6

    now对象的星期是:五

    now对象的月份是: 十一月

    展开全文
  • 一、java.util.Date日期类private Integer age;//员工年龄private String hireDate;//入职时间在系统中存储的是员工的基本信息,包括了员工的年龄,此时使用Integer/int类型来表示年龄是不合理的难道每年都得修改...

    一、java.util.Date日期类

    private Integer age;//员工年龄

    private String hireDate;//入职时间

    在系统中存储的是员工的基本信息,包括了员工的年龄,此时使用Integer/int类型来表示年龄是不合理的

    难道每年都得修改系统中员工的年龄递增1?

    1.类 Date 表示特定的瞬间,精确到毫秒。

    c436e20cdc1e0f05716e8458413ceae3.png

    39e12e175f23becc6842d651d1215f7c.png

    Date类中有一个方法可以返回自1970年以来到现在的毫秒值,这就是getTime方法,是一个long类型的值

    a562b639e68127aa07dab4bd8a36ac65.png

    bdefd2ae5b0c5db37428f5201f4f0c43.png

    Date类中有很多过时的方法,但这些过时的方法中也有比较好用的,比如下边这个

    b64ded8aaf02fe5d794312bd64be9ef6.png

    96409a6d5388a80f6134064663a9db5c.png这个表示形式比较符合我们中国人的习惯

    二、DateFormat格式化日期

    格式化: Date类型对象--->String类型

    解析:String类型时间---->Object类型

    1.格式化日期类中的方法

    c9113e515e9562a04cc317904fc770d9.png

    2323e18fdab6eae1c1944e317812be2d.png

    778fb7e594aa0d9376a75809a1111381.png

    72d3dd577c42e14e553b1e2ff9200b79.png

    2.格式化:Date类型对象--->String类型

    818639f2011bf0f6417e64ac57fdab25.png

    10af1e23cf7dfe4b010d3cdfa7526168.png

    3.解析:String类型时间---->Object类型

    50933aba5d05af25b38557368cdab4a9.png

    ac491e09597bd0018f2b640c7626f1e9.png

    4.自定义日期模式

    fa4afcc01b2493f3b2a6043bf4c7287e.png

    18a3e2b703fe94d13565a58582fe43a2.png

    三、日历类

    1.常用方法

    0a949419eba2e1c963186ea5c9fd60c1.png

    我们创建一个日历对象

    a2416b9203506d1e636436fec655c9a7.png

    9b19ffed832687f22bc3d82b9b7dab56.png

    发现输出了一大堆不是很好看懂的内容,这可怎么办呢?

    2.这就要用到get方法,获取时间字段值

    ba5ee0123bd0cd75afbc7cb6db4a5ea1.png

    5e9a04991bdbc52be7ef2b135c4ce2eb.png

    3.如何添加和设置日期呢?

    这就用到add和set方法

    6ccd2c1bd532a3530c54f7b94ea0532a.png100天后是几月几号呢?

    79b4964c802dd051c42295fca196049d.png

    b8d63fcdee4375047e49da34f95435b7.png

    ad31fae2c5884b2a0ecf50fd86dcab68.png

    4.日历类也可以转化为日期

    2911d3c4ece71c71a4b9ab524a8a7ec1.png

    be9360003fe1446edfb5091f2de9e035.png

    注意:在Calendar类中,月份的表示是以0-11代表1-12月。

    案例1:

    //计算起止时间

    //查询最近一周的信息,如何表示最近这一周

    Date current =newDate();//把当前时间作为日历的时间

    Calendar c3=Calendar.getInstance();

    c3.setTime(current);//把日增加1天,再把时分秒设置为0

    c3.add(Calendar.DAY_OF_MONTH, 1);

    c3.set(Calendar.HOUR_OF_DAY,0);//时设置成0

    c3.set(Calendar.MINUTE, 0);//分设置成0

    c3.set(Calendar.SECOND, 0);//秒设置成0

    Date endTime=c3.getTime();

    c3.add(Calendar.DAY_OF_MONTH,-7);

    Date beginTime=c3.getTime();

    System.out.println("开始时间="+beginTime.toLocaleString());

    System.out.println("结束时间="+endTime.toLocaleString());

    b888406101afa38fb878338007d65fc8.png

    案例2:获取自己出生到现在的天数

    public static voidmain(String[] args){

    Calendar my=Calendar.getInstance();

    Calendar c=Calendar.getInstance();//设置出生年月日 1995-05-10

    my.set(Calendar.YEAR, 1995);

    my.set(Calendar.MONTH,4);

    my.set(Calendar.DATE,10);//获取时间中的天数

    int day =c.get(Calendar.DATE);int myDay =my.get(Calendar.DATE);

    System.out.println(day-myDay);

    }

    案例3:求出距离某年某月某日还有多少天

    public static voidmain(String[] args){

    Calendar my=Calendar.getInstance();

    Calendar c=Calendar.getInstance();//设置年月日 2020-01-01

    my.set(Calendar.YEAR, 2020);

    my.set(Calendar.MONTH,0);

    my.set(Calendar.DATE,1);//获取时间中的天数

    int day =c.get(Calendar.DATE);int myDay =my.get(Calendar.DATE);

    System.out.println(myDay-day);

    }

    public static void main(String[] args){

    Calendar my = Calendar.getInstance();

    Calendar c = Calendar.getInstance();

    //设置年月日2020-01-01

    my.set(Calendar.YEAR, 2020);

    my.set(Calendar.MONTH, 0);

    my.set(Calendar.DATE, 1);

    //获取时间中的天数

    int day = c.get(Calendar.DATE);

    int myDay = my.get(Calendar.DATE);

    System.out.println(myDay - day);

    }

    展开全文
  • 适合同一目录下很多文件,可以把照片,日志,按日期为文件夹名分类文件。这样你就可以很方便的查询文件了~~
  • #include&lt;bits/stdc++.h&gt; using namespace std; class Date ...//创建日期类的构造函数  Date();//无参构造函数  void setDate(int y,int m,int d);//修改日期  void display(); priv...

    #include<bits/stdc++.h>
    using namespace std;
    class Date
    {
    public:
        Date(int y,int m,int d);//创建日期类的构造函数
        Date();//无参构造函数
        void setDate(int y,int m,int d);//修改日期
        void display();
    private:
        int year,month,day;
    };
    Date::Date(int y,int m,int d)
    {
        year=y;month=m;day=d;
    }
    Date::Date()
    {
        year=month=day=0;
    }
    void Date::setDate(int y,int m,int d)
    {
        year=y;month=m;day=d;
    }
    void Date::display()
    {
        cout<<year<<"\t"<<month<<"\t"<<day<<endl;
    }
    class Student//学生类
    {
    public:
        Student(int y,int m,int d,int num,string na):birthday(y,m,d)//初始化,在构造函数一开始就要进行相应的初始化,并且自动调用日期类的构造函数
        {
            code=num;
            name=na;
        }//直接在构造函数声明是进行初始化
        Student();
        void setStudent(int y,int m,int d,int num,string na);
        void display();
    private:
        int code;
        string name;
        Date birthday;//定义一个日期类的对象作为学生类的数据成员

    };
    Student::Student()
    {
        code=0;
        name="0";//name是字符串类型的数据,要用“”括起来
    }
    void Student::setStudent(int y,int m,int d,int num,string na)//不带参数的构造函数初始化时,只初始化学生类自己的数据成员
    {
        code=num;name=na;
    }
    void Student::display()
    {
        cout<<code<<name;
        birthday.display();//输出时,调用日期类输出函数,
        cout<<endl;
    }
    int main()
    {
        Date d(1998,06,03);
        d.display();
        Student stu(1998,6,3,123456,"Lily");
        stu.display();
    }

    展开全文
  • windows =&gt; preferences =&gt; Java =&gt; Code Style =&gt; Code Templates =&gt; Code =&gt;...* @version 创建时间:${date} ${time} */ 下面是截图示例: ...
  • Java开发编程规范系列之强制所有都必须添加创建者和创建日期 在Eclipse中自定义新建注释偏好的位置是在preference下,具体配置过程: 新建文件就可以看到作者和创建时间:
  • 配置eclipse,创建/方法时自动生成作者、创建日期、方法功能等注释 https://blog.csdn.net/cincoutcin/article/details/84481345
  • 日期和日历

    2020-10-23 18:49:09
    一、日期和日历类 1、日期类 Date ...​ 创建日期类 Date date = new Date(); Date date = new Date(long) ; // 创建日期类的对象 Date date = new Date(); //获取当前时间 以 标准格式 Syste
  • 【C++】日期类创建

    2021-03-12 08:46:23
    cout 非法日期!" ; //非法设置111 } else{ _year = year; _month = month; _day = day; } } //运算符重载函数 Date& operator+=(int day){ _day += day; while (_day > ...
  • 文章目录前言测试代码...public class 日期时间类创建解析速度测试 { long totalAmount001 = 10_000_000L; void p(Object o) {System.out.println(o);} @Test public void testSystemCurrentTimeMillisSpeed
  • Python实现图片按照创建日期进行自动归类发布时间:2018-06-18 20:46,浏览次数:364, 标签:Python可能或多或少每个人都有很多照片堆积,或许你要把照片按照创建日期做整理做个视频又或者你只是单纯的想分个,然而...
  • JAVA实现创建一个日期类Date,其功能包括: (1)能够以不同的格式输出日期,例如, MM/DD/YYYY June 14, 2014 2015年3月6日 (2)定义3个重载的构造函数,在创建Date对象时,可用以上3种格式进行初始化提示: (1)本题需要...
  • DAY15 日期和日历

    2020-10-25 19:14:47
    DAY22 一、日期和日历类 1、日期类 Date ...​ 创建日期类 Date date = new Date(); Date date = new Date(long) ; // 创建日期类的对象 Date date = new Date(); //获取当前时间 以 标准格式
  • 我创建了3:用户如何在我的日历(java)中创建日期?1日期(包括年,月...)2. TERMIN(包括人,地方,Date ... +一个选项创建日期)3. Mainclass我的主菜单包含菜单。我的问题是,我不知道用户如何能够创建自己的...
  • 日期类

    2019-04-12 14:20:00
    日期类  与时间相关的类  1.System类下的currentTimeMillis()  2.Date类:java.util.Date(以及其子类java.sql.Date)  如何创建其实例:其下方法:toString()、getTime()  3.SimpleDateFormat类  4....
  • #include using namespace std; class Date { public: Date(int year = 2017, int month = 9, int day = 10) : _year(year) , _month(month) ... { //这里是判断如果输入内容不符合日期的格式,就会默认为1990
  • 为了在创建一个的时候能自动填充个人信息以及日期,如下图
  • class Date//日期类 { private int year=2000; private int month=1; private int day=1; public Date(int year,int month,int day) { if(year>=1&&year<=2020) { this.year=year; if...
  • 日期类详解

    2019-08-15 16:03:44
    日期类详解日期类导包:构造方法成员方法缺点: 日期类导包: Date java.util.Date java.sql.Date 一般情况下我们使用 java.util.Date 构造方法 public Date() 根据当前的默认毫秒值创建日期对象 public ...
  • Java 根据现有实例创建日期和时间,用户希望修改 Date-Time API 中某个的现有实例,如果需要进行简单的增减操作,使用 plus 或 minus 方法;对于其他操作,使用 with 方法。Date-Time API 中的所有实例都是不可变...
  • 1、找到eclipse.ini文件 2、在文件中找到  -vmargs -Duser.name=xxxxxxxx 3、修改xxxxxxxx为你的名字 4、eclipse中:Window -> Preference -> Java -> Code Style -> Code Templates ......
  • 一、配置文件头注释模版 最大化IDEA,点击左上角Preferences-----》Editor-----》File and Code Templates,也可以使用快捷键【command+,】弹出弹出框 填写文件头注释模板,可以更具右下方Description提供的...
  • 很多小伙伴在创建新的的时候都要都要手动写的注释,如作者名称、创建日期、版本等等,当有几个的时候还可以手动写写,但有几十个或者更多的的时候就麻烦了,所以我们可以设定Visual Studio 2017让工具帮我们...
  • Java常用类——日期类

    2021-05-07 20:44:21
    Java常用类——日期类日期类Calendar类 日期类 Date()类:返回当前的系统时间 格式化类:DateFormat抽象类——SimpleDateFormat()具体实现类 格式化Date可以按照常规的形式对日期进行格式化输出 //返回当前时间,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,534
精华内容 2,613
关键字:

创建日期类