Java Date 和 Calendar

Java 语言的Date(日期),Calendar(日历),DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分。日期是商业逻辑计算一个关键的部分,所有的开发者都应该能够计算未来的日期,定制日期的显示格式,并将文本数据解析成日期对象。 

创建一个日期对象 

让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数,这个时间通常被称为Java 虚拟机(JVM)主机环境的系统时间。

import java.util.Date;

public class DateTest {
	public static void main(String[] args) {
		Date date = new Date();
		System.out.println(date);				// Fri Mar 02 22:38:41 CST 2012
		System.out.println(date.getTime());		// 1330699121772
	}
}

星期五,2012年3月2日,下午大约是22:38:41的样子,上面的例子在系统输出设备上显示的结果是 1330699121772。值得注意的是我们使用了Date 构造函数创建一个日期对象,这个构造函数没有接受任何参数,而这个构造函数在内部使用了System.currentTimeMillis() 方法来从系统获取日期。现在我们已经知道了如何获取从1970年1月1日开始经历的毫秒数了。我们如何才能以一种用户明白的格式来显示这个日期呢? 在这里类java.text.SimpleDateFormat 和它的抽象基类 java.text.DateFormat 就派得上用场了。 

日期数据的定制格式 

假如我们希望定制日期数据的格式,比方星期五-3月-02日-2012年. 下面的例子展示了如何完成这个工作: 

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

public class DateTest {
	public static void main(String[] args) {
		Date date = new Date();
		
		SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE-MMMM-dd-yyyy");
		System.out.println(dateFormat.format(date));				// Friday-March-02-2012
	}
}

只要通过向SimpleDateFormat 的构造函数传递格式字符串"EEE-MMMM-dd-yyyy",我们就能够指明自己想要的格式。格式字符串中的ASCII 字符告诉格式化函数下面显示日期数据的哪一个部分。EEEE是星期,MMMM是月,dd是日,yyyy是年,字符的个数决定了日期是如何格式化的。传递"EE-MM-dd-yy"会显示 Friday-March-02-2012。 

将文本数据解析成日期对象 

假设我们有一个文本字符串包含了一个格式化了的日期对象,我们希望解析这个字符串并从文本日期数据创建一个日期对象。我们将再次以格式化字符串"MM-dd-yyyy" 调用SimpleDateFormat类。但是这一次,我们使用格式化解析而不是生成一个文本日期数据。我们的例子显示在下面,将解析文本字符串"3-02-2012"并创建一个值为1330617600000 的日期对象。

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

public class DateTest {
	public static void main(String[] args) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy");
		String txtDate = "3-02-2012";
		
		try {
			Date date = dateFormat.parse(txtDate);
			System.out.println(date.getTime());					// 1330617600000
			System.out.println(dateFormat.format(date));		// 03-02-2012
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
}


使用标准的日期格式化过程 

既然我们已经可以生成和解析定制的日期格式了,让我们来看一看如何使用内建的格式化过程。方法 DateFormat.getDateTimeInstance() 让我们得以用几种不同的方法获得标准的日期格式化过程。下面是我们获取了六个内建的日期格式化过程。它们包括一个空,默认,短的,中等的,长的,完整的日期格式。 

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

public class DateTest {
	public static void main(String[] args) {
		String strDate = null;
		
		Date date = new Date();
		System.out.println(date);			// Fri Mar 02 21:43:55 CST 2012
		
		strDate = DateFormat.getDateInstance().format(date);
		System.out.println(strDate);		// Mar 2, 2012

		
		// Date
		strDate = DateFormat.getDateInstance(DateFormat.DEFAULT).format(date);
		System.out.println(strDate);		// Mar 2, 2012

		strDate = DateFormat.getDateInstance(DateFormat.SHORT).format(date);
		System.out.println(strDate);		// 3/2/12
		
		strDate = DateFormat.getDateInstance(DateFormat.MEDIUM).format(date);
		System.out.println(strDate);		// Mar 2, 2012

		strDate = DateFormat.getDateInstance(DateFormat.LONG).format(date);
		System.out.println(strDate);		// March 2, 2012

		strDate = DateFormat.getDateInstance(DateFormat.FULL).format(date);
		System.out.println(strDate);		// Friday, March 2, 2012
		

		// DateTime
		strDate = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT).format(date);
		System.out.println(strDate);		// Mar 2, 2012 11:06:36 PM

		strDate = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(date);
		System.out.println(strDate);		// 3/2/12 11:06 PM
		
		strDate = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(date);
		System.out.println(strDate);		// Mar 2, 2012 11:06:36 PM

		strDate = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(date);
		System.out.println(strDate);		// March 2, 2012 11:06:36 PM CST

		strDate = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL).format(date);
		System.out.println(strDate);		// Friday, March 2, 2012 11:06:36 PM CST
	}
}

运行结果: 
Fri Mar 02 23:06:36 CST 2012
Mar 2, 2012
Mar 2, 2012 11:06:36 PM
3/2/12 11:06 PM
Mar 2, 2012 11:06:36 PM
March 2, 2012 11:06:36 PM CST
Friday, March 2, 2012 11:06:36 PM CST
Mar 2, 2012
3/2/12
Mar 2, 2012
March 2, 2012
Friday, March 2, 2012

注意我们在对 getDateTimeInstance的每次调用中都传递了两个值:第一个参数是日期风格,而第二个参数是时间风格。它们都是基本数据类型int(整型)。考虑到可读性,我们使用了DateFormat 类提供的常量: DEFAULT,SHORT,MEDIUM,LONG, FULL。 


Calendar 类 

我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar 类。 

假设你想要设置,获取,操纵一个日期对象的各个部分,比方一个月的一天或者是一个星期的一天,为了演示这个过程,我们将使用具体的子类 java.util.GregorianCalendar。 考虑下面的例子,它计算得到下面的第十个星期五是13号。 

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

public class CalendarTest {
	public static void main(String[] args) {
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL);
		GregorianCalendar calendar = new GregorianCalendar();
		
		calendar.setTime(date);
		System.out.println("System Date: " + calendar.getTime());
		
		calendar.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY);
		System.out.println("Day of Week to Friday: \n" + dateFormat.format(calendar.getTime()));
		
		int friday13Counter = 0;
		while(friday13Counter <= 10) {
			calendar.add(GregorianCalendar.DAY_OF_MONTH, 7);
			if(calendar.get(GregorianCalendar.DAY_OF_MONTH) == 13) {
				friday13Counter++;
				System.out.println(dateFormat.format(calendar.getTime()));
			}
		}
	}
}

运行结果:

System Date: Fri Mar 02 23:37:01 CST 2012
Day of Week to Friday: 
Friday, March 2, 2012
Friday, April 13, 2012
Friday, July 13, 2012
Friday, September 13, 2013
Friday, December 13, 2013
Friday, June 13, 2014
Friday, February 13, 2015
Friday, March 13, 2015
Friday, November 13, 2015
Friday, May 13, 2016
Friday, January 13, 2017
Friday, October 13, 2017


在这个例子中我们作了有趣的函数调用:

  calendar.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY) 和 calendar.add(GregorianCalendar.DAY_OF_MONTH, 7)

set 方法能够让我们通过简单的设置星期中的哪一天这个域来将我们的时间调整为星期五。注意到这里我们使用了常量 DAY_OF_WEEK 和 FRIDAY来增强代码的可读性。

add 方法让我们能够在日期上加上数值,润年的所有复杂的计算都由这个方法自动处理。 

我们这个例子的输出结果是: 
System Date: Fri Mar 02 23:33:19 CST 2012

当我们将它设置成星期五以后就成了:

Day of Week to Friday: 
Friday, March 2, 2012
Friday, April 13, 2012
Friday, July 13, 2012
Friday, September 13, 2013
Friday, December 13, 2013
Friday, June 13, 2014
Friday, February 13, 2015
Friday, March 13, 2015
Friday, November 13, 2015
Friday, May 13, 2016
Friday, January 13, 2017
Friday, October 13, 2017

时间掌握在你的手里 

有了这些Date 和Calendar 类的例子,你应该能够使用 java.util.Date,java.text.SimpleDateFormat, java.util.GregorianCalendar 创建许多方法了。


测试代码下载


参考推荐:

Java语言的Calendar和Date类

Java 之 Date 和 Calendar 实例

JAVA Calendar详解

Date类型的转换和运算

“Java语言的Calendar和Date类” 的更多相关文章



  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: Java中的DateCalendar类都可以用来处理日期和时间。但是它们之间有一些区别。 Date类是一个表示特定时间点的类。它包含了从1970年1月1日00:00:00 UTC到指定时间之间所经过的毫秒数。Date类中的大多数方法都已被废弃,因为它们存在一些问题,例如时区问题和不可变性问题。 Calendar类是一个抽象类,它提供了一些方法来处理日期和时间。它可以用来获取各种日期和时间信息,例如年、月、日、时、分、秒等等。它还可以用来进行日期和时间的计算和比较。Calendar类的一个重要特性是它可以处理不同的时区和日历系统。 总的来说,如果你需要处理一个特定的时间点,那么可以使用Date类。但是如果你需要进行日期和时间的计算或者处理多个时区和日历系统,那么应该使用Calendar类。此外,Java 8 中引入了新的日期和时间API,即java.time包,它提供了更好的日期和时间处理方式。 ### 回答2: Java中的DateCalendar是用于处理日期和时间的类。 Date类是Java中最基本的日期和时间类。它表示特定的瞬间,精确到毫秒级别。可以通过创建Date对象来获取当前的日期和时间,并且可以通过方法来进行日期和时间的计算、格式化和解析等操作。但是它也有一些缺点,比如它不是线程安全的,在处理日期和时间时有一些限制。 为了解决Date类的一些问题,Java提供了Calendar类。Calendar类用于处理日期和时间,它提供了比Date类更多的功能和灵活性。它可以用于获取和设置特定日期和时间的年、月、日、时、分、秒等信息,还可以进行日期的加减计算、格式化和解析等操作。与Date类不同,Calendar类是可变的,也是线程安全的,可以同时在多线程环境下使用。 使用Calendar类的步骤通常是首先获取一个Calendar对象,然后通过设置其各个字段来表示指定的日期和时间,最后可以通过方法来获取所需的日期和时间信息。Calendar类的一个常见用途是进行日期的加减计算,比如可以使用add方法来增加或减少指定的年、月、日等。另外,Calendar类还提供了一些其他有用的方法,比如获取某一年的某个月的最大天数、判断某一年是否是闰年等。 总的来说,Date类和Calendar类都可以用于处理日期和时间,但是Calendar类提供了更多的功能和灵活性。在实际开发中,根据具体需求,我们可以选择使用其中的哪一个类来处理日期和时间。 ### 回答3: Java中的DateCalendar是用于处理日期和时间的类。它们虽然都可以表示日期和时间,但在使用和功能上有一些不同。 1. Date类是Java中最早的日期和时间类,它提供了许多方法来获取和设置日期、时间和日期时间。它可以表示年、月、日、时、分、秒和毫秒。但是,Date类的问题在于它的设计不够合理,其中一些方法已经过时了,而且它也不能处理夏令时等时间调整问题。 2. Calendar类是Java中日历类的抽象基类,它提供了一些用于操作日期和时间的方法。与Date类不同,Calendar类提供了更多的功能,比如计算某个时间之前或之后的日期、获取某个日期是星期几等。Calendar类还可以处理夏令时,以及在使用时区和本地化设置时更加灵活。 在使用上,我们可以使用Date类来表示一个具体的时间点,比如一个事件发生的时间。我们可以使用Date类的构造器创建Date对象,然后通过一些方法来获取和设置其对应的日期和时间。 而Calendar类则更适合于处理日期和时间的计算和操作。我们可以使用Calendar类的getInstance()方法获取一个默认时区的Calendar对象,然后使用其提供的方法来进行日期和时间的计算和操作。 总结起来,Date类是一个简单的日期和时间类,适合表示具体的时间点;而Calendar类则提供了更多的功能和灵活性,适合进行日期和时间的计算和操作。在实际应用中,我们可以根据具体的需求选择使用Date类还是Calendar类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值