ITPub博客

首页 > 应用开发 > IT综合 > 操作日期

操作日期

原创 IT综合 作者:clairejin 时间:2007-09-17 15:21:11 0 删除 编辑
Java 语言提供了许多处理日期的工具。其中一些工具在其他语言中使用起来更困难一些。尽管如此,Java 语言提供的那些工具几乎可以做创建日期方面的任何事情,并完全根据您想要的格式对这些日期进行格式化。 当 Java 语言出错时,它会包含一个叫做 Date 的类,这个类对创建和处理日期很有帮助。不幸的是,这个类在支持同步方面表现不是很好,所以 Sun 添加了两个帮助改善这种情况的类: · Calendar · DateFormat 首先讨论一下 Calendar,稍后再讨论 DateFormat。 创建 Date 仍然比较容易: Date aDate = new Date(System.currentTimeMillis()); 或者可以使用以下代码: Date aDate = new Date(); 这将为我们提供一个表示当前确切日期和时间的 Date,并以当前地区 格式显示。国际化已经超出了本教程的范围,只要知道获得的 Date 与本地机器的地区时间一致即可。 既然有了一个实例,为什么不能处理它呢?坦率地说,它太小了。我们可以将一个 Date 与另一个日期进行比较,查看前一个日期是在后一个日期的 before() 还是 after()。还可以通过调用 setTime() 将日期重新设置为一个新的时间瞬间,setTime() 带有一个 long 参数,该参数表示从 1970 年 1 月 1 日午夜起至现在过去了多少毫秒,这也正是 System.currentTimeMillis() 返回的值。在此之外,我们受到了限制。 日历 现在,Date 给人们带来的混乱要多于它为人们带来的有用性,因为大部分日期处理行为都受到人们的抨击。人们习惯于获得并设置部分 Date(比如,年、月,等等)。现在,必须同时处理 Date 和 Calendar 才能设置部分 Date。但是一旦有了 Date 实例,就可以使用 Calendar 获得并设置部分 Date。例如: Date aDate = new Date(System.currentTimeMillis()); Calendar calendar = GregorianCalendar.getInstance(); calendar.setTime(aDate); 在这里,我们创建了一个 GregorianCalendar,并将它的时间设置为以前创建的 Date。通过在 Calendar 上调用不同的方法,也能做到这一点: Calendar calendar = GregorianCalendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); 通过 Calendar,我们现在可以访问和操作 Date 的组件。获得并设置部分 Date 也成为一个简单的过程。只需要在 Calendar 上调用适当的 getter 和 setter 即可,如下所示: calendar.set(Calendar.MONTH, Calendar.JULY); calendar.set(Calendar.DAY_OF_MONTH, 15); calendar.set(Calendar.YEAR, 1978); calendar.set(Calendar.HOUR, 2); calendar.set(Calendar.MINUTE, 15); calendar.set(Calendar.SECOND, 37); System.out.println(calendar.getTime()); 这将输出 1987 年 7 月 15 日上午 2 点 15 分 37 秒的格式化后的输出字符串。(在 Calendar 上也有一些辅助方法,允许同时设置一些或几乎所有的组件。)这里调用的是 set(),它带有两个参数: · 想要设置的 Date 的 field(或组件)。 · 该字段的值。 我们可以用 Calendar 类中指定的常数来引用这些字段。在某些情况下,同一字段会有一个以上的名称,比如 Calendar.DAY_OF_MONTH,还可以用 Calendar.DATE 来引用它。除了可能是 Calendar.MONTH 的值和 Calendar.DATE 的值之外,其他的值都很简单。在 Java 语言的日期中,月份是基于 0 的(也就是说,1 月是 0),这使得使用指定的常数来设置月份值成为一种明智之举,但也使得正确地显示日期成为令人沮丧的事。小时的数值是从 0 到 24。 一旦有一个建立好的 Date,就可以提取其中的一部分。 System.out.println("The YEAR is: " + calendar.get(Calendar.YEAR)); System.out.println("The MONTH is: " + calendar.get(Calendar.MONTH)); System.out.println("The DAY is: " + calendar.get(Calendar.DATE)); System.out.println("The HOUR is: " + calendar.get(Calendar.HOUR)); System.out.println("The MINUTE is: " + calendar.get(Calendar.MINUTE)); System.out.println("The SECOND is: " + calendar.get(Calendar.SECOND)); System.out.println("The AM_PM indicator is: " + calendar.get(Calendar.AM_PM)); 内置日期的格式化 通常可以使用 Date 格式化日期。现在,必须使用其他几个类: · DateFormat · SimpleDateFormat · DateFormatSymbols 在这里,我们并不想介绍日期格式化所涉及的所有复杂事物。您可以自己去研究这些类。但我们仍将介绍一些使用这些工具的基础知识。 DateFormat 类允许我们创建特定于场所的格式化程序,如下所示: DateFormat dateFormatter = DateFormat.getDateInstance(DateFormat.DEFAULT); Date aDate = new Date(); String formattedDate = dateFormatter.format(today); 该代码使用用于这种场所的默认格式创建了一个格式化的日期字符串。在我的机器上,这个日期字符串看起来是这样的: Nov 11, 2005 这是默认样式,但所有的样式都适用于我们。我们可以使用任何预定义的样式。还可以调用 DateFormat.getTimeInstance() 来格式化时间,或者调用 DateFormat.getDateTimeInstance() 将日期和时间一起格式化。以下是各种样式的输出,都适用于美国地区: 样式 日期 时间 日期/时间 DEFAULT Nov 11, 2005 7:44:56 PM Nov 11, 2005 7:44:56 PM SHORT 11/11/05 7:44 PM 11/11/05 7:44 PM MEDIUM Nov 11, 2005 7:44:56 PM Nov 11, 2005 7:44:56 PM LONG November 11, 2005 7:44:56 PM EST November 11, 2005 7:44:56 PM EST FULL Thursday, November 11, 2005 7:44:56 PM EST Thursday, November 11, 2005 7:44:56 PM EST 定制格式化: 这些预定义的格式在大多数情况下表现良好,但是您也可以使用 SimpleDateFormat 定义自己的格式。使用 SimpleDateFormat 非常简单: · 使用一个格式模式字符串(和一个地区,如果您希望的话)来实例化 SimpleDateFormat。 · 使用 Date 在其上调用 format()。 结果是一个格式化了的日期字符串。以下是一个例子: Date aDate = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy"); String formattedDate = formatter.format(today); System.out.println(formattedDate); 在运行该代码时,将获得以下类似结果(当然,它将影响运行代码时的当前日期): 11/05/2005 在上述例子中,用引号括起来的字符串遵循了日期格式化模式的模式语法规则。Java.sun.com 中有一些那些规则的很好概括(请参阅 参考资料)。以下是一些有用的经验法则:您可以指定日期和时间的模式。 · 一些模式语法并不是由直觉得到的(例如,mm 定义了一个两位数的分钟模式;要获得简写的月份,可以使用 MM)。 · 通过将文本文字放入单括号中可以在模式中包含这些文本文字(例如,在上述代码中使用 "'on' MM/dd/yyyy" 将产生 on 11/05/2005)。 · 模式文本组件中的字符数指出了将使用的是简写模式还是长模式("MM" 得到的是 11,"MMM" 得到的是 Nov,而 "MMMM" 得到的是 November)。 · 模式数字组件中的字符数指出了数位的最小数。 如果 SimpleDateFormat 的标准符号仍然无法满足您定制格式化方面的需求,那么可以使用 DateFormatSymbols 定制用于任何 Date 或时间组件的符号。例如,可以实现惟一一组某年的月份的简写(使用与以前相同的 SimpleDateFormat),如下所示: DateFormatSymbols symbols = new DateFormatSymbols(); String[] oddMonthAbbreviations = new String[] { "Ja","Fe","Mh","Ap","My","Jn","Jy","Au","Se","Oc","No","De" }; symbols.setShortMonths(oddMonthAbbreviations); formatter = new SimpleDateFormat("MMM dd, yyyy", symbols); formattedDate = formatter.format(now); System.out.println(formattedDate); 该代码在 SimpleDateFormat 上调用了一个不同的构造函数,该函数采用了一个模式字符串,以及一个定义以某种模式显示简写月份时使用的缩写词的 DateFormatSymbols。在使用这些符号格式化日期时,结果是产生如下所示的 Date 格式,我们在上面见到过: No 15, 2005 SimpleDateFormat 和 DateFormatSymbols 的定制功能应该足以创建任何您需要的格式。 通过增大和减小日期值或部分日期值。有两种方法可以让您做到这一点: · add() · roll() 第一种方法允许将一些时间量添加到 Date 的特定区段中(或者通过添加负时间量来减少时间量)。做到这一点需要以增加某一特定区段为基础来相应地调整 Date 的其他所有区段。例如,假定日期是从 2005 年 11 月 15 日开始的,并且要将表示天数的字段增加到 20。那么我们可以使用以下代码: Calendar calendar = GregorianCalendar.getInstance(); calendar.set(Calendar.MONTH, 10); calendar.set(Calendar.DAY_OF_MONTH, 15); calendar.set(Calendar.YEAR, 2005); formatter = new SimpleDateFormat("MMM dd, yyyy"); System.out.println("Before: " + formatter.format(calendar.getTime())); calendar.add(Calendar.DAY_OF_MONTH, 20); System.out.println("After: " + formatter.format(calendar.getTime())); 结果看起来如下所示: Before: Nov 15, 2005 After: Dec 05, 2005 相当简单。但是调整 Date 是什么意思呢?它意味着可以通过给定时间量来增加或减小特定日期/时间区段的值,而不会影响其他区段。例如,我们可以将日期从 11 月份调整到 12 月份: Calendar calendar = GregorianCalendar.getInstance(); calendar.set(Calendar.MONTH, 10); calendar.set(Calendar.DAY_OF_MONTH, 15); calendar.set(Calendar.YEAR, 2005); formatter = new SimpleDateFormat("MMM dd, yyyy"); System.out.println("Before: " + formatter.format(calendar.getTime())); calendar.roll(Calendar.MONTH, true); System.out.println("After: " + formatter.format(calendar.getTime())); 注意,月份向上调整(或增加)了 1。有两种格式的 roll(): · roll(int field, boolean up) · roll(int field, int amount) 我们采用第一种格式。要使用这种格式增加某一字段值,则需要将 false 作为第二个参数传递。该方法的第二种格式允许指定增加或减少的量。如果调整操作创建了一个无效值(例如,09/31/2005),那么这些方法会根据日期、时间等区段的有效最大和最小值来相应地调整其他区段。可以用正值向前调整日期,同时也可以使用负值向后调整日期。 试着预测调整操作将做什么,以及您可以做什么,这样做很好,但是通常反复试验并找出错误才是最好的方法。有时您的猜测是正确的,但是有时则必须做试验,以查看怎样才能产生正确的结果。 使用日期 第 7 页(共7 页) 每个人都有一个生日。让我们将这个生日日期添加到 Person 类中。首先要添加一个实例变量到 Person 中: protected Date birthdate = new Date(); 接下来要添加用于该变量的存取程序: public Date getBirthdate() { return birthdate; } public void setBirthdate(Date birthday) { this.birthdate = birthday; } 然后要删除 age 实例变量,因为我们现在将计算它。我们还将删除 setAge() 存取程序,因为 age 现在是一个派生值。然后将使用以下代码替换 getAge() 的主体: public int getAge() { Calendar calendar = GregorianCalendar.getInstance(); calendar.setTime(new Date()); int currentYear = calendar.get(Calendar.YEAR); calendar.setTime(birthdate); int birthYear = calendar.get(Calendar.YEAR); return currentYear - birthYear; } 通过使用这种方法,现在可以根据 Person 的 birthdate 的年份和当前日期所在的年份来计算 age 的值。 现在可以试着使用以下代码进行计算: Calendar calendar = GregorianCalendar.getInstance(); calendar.setTime(new Date()); calendar.set(Calendar.YEAR, 1971); calendar.set(Calendar.MONTH, 2); calendar.set(Calendar.DAY_OF_MONTH, 23); Adult anAdult = new Adult(); anAdult.setBirthdate(calendar.getTime()); System.out.println(anAdult); 将 Adult 上的 birthdate 设置为 1971 年 3 月 23 日。如果在 2005 年 1 月运行该代码,那么应该获得以下输出: An Adult with: Age: 33 Name: firstname lastname Gender: MALE Progress: 0 还有其他少数辅助工作细节,我将这些留作您的练习: · 更新 Adult 上的 compareTo(),以反映新的实例变量的存在。 · 如果已经实现它,则必须更新 Adult 上的 equals() 来反映新的实例变量的存在。 · 如果已经实现 equals(),那么也就已经实现了 hashCode(),并且必须更新 hashCode() 来反映新的实例变量的存在。[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8869977/viewspace-969763/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 时间格式化
下一篇: 没有了~
请登录后发表评论 登录
全部评论
  • 博文量
    13
  • 访问量
    158701