扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
日期处理 GregorianCalendar类提供处理日期的方法。一个有用的方法是add().使用add()方法,你能够增加象年,月数,天数到日期对象中。要使用add()方法,你必须提供要增加的字段,要增加的数量。一些有用的字段是DATE, MONTH, YEAR, 和 WEEK_OF_YEAR。下面的程序使用add()方法计算未来80天的一个日期。在Jules的<环球80天>是一个重要的数字,使用这个程序可以计算Phileas Fogg从出发的那一天1872年10月2日后80天的日期: import java.util.*; import java.text.*; public class World { public static void main(String[] args) { GregorianCalendar worldTour = new GregorianCalendar(1872, Calendar.OCTOBER, 2); worldTour.add(GregorianCalendar.DATE, 80); Date d = worldTour.getTime(); DateFormat df = DateFormat.getDateInstance(); String s = df.format(d); System.out.println("80 day trip will end " + s); } }
这个例子是想象的,但在一个日期上增加天数是一个普遍的操作:影碟可以租3天,图书馆可以借书21天,商店经常需要将购买的物品在30天内卖出。下面的程序演示了使用年计算: import java.util.*; import java.text.*; public class Mortgage { public static void main(String[] args) { GregorianCalendar mortgage = new GregorianCalendar(1997, Calendar.MAY, 18); mortgage.add(Calendar.YEAR, 15); Date d = mortgage.getTime(); DateFormat df = DateFormat.getDateInstance(); String s = df.format(d); System.out.println("15 year mortgage amortized on " + s); } }
add()一个重要的副作用是它改变的原来的日期。有时候,拥有原始日期和修改后的日期很重要。不幸的是,你不能简单的创建一个GregorianCalendar对象,设置它和原来的相等(equal)。原因是两个变量指向同一个Date()对象地址。如果Date对象改变,两个变量就指向改变后的日期对象。代替这种做法,应该创建一个新对象。下面的程序示范了这种做法: import java.util.*; import java.text.*; public class ThreeDates { public static void main(String[] args) { GregorianCalendar gc1 = new GregorianCalendar(2000, Calendar.JANUARY, 1); GregorianCalendar gc2 = gc1; GregorianCalendar gc3 = new GregorianCalendar(2000, Calendar.JANUARY, 1); //Three dates all equal to January 1, 2000 gc1.add(Calendar.YEAR, 1); file://gc1 and gc2 are changed DateFormat df = DateFormat.getDateInstance(); Date d1 = gc1.getTime(); Date d2 = gc2.getTime(); Date d3 = gc3.getTime(); String s1 = df.format(d1); String s2 = df.format(d2); String s3 = df.format(d3); System.out.println("gc1 is " + s1); System.out.println("gc2 is " + s2); System.out.println("gc3 is " + s3); } }
程序运行后,gc1和gc2被变成2001年(因为两个对象指向同一个Date,而Date已经被改变了)。对象gc3指向一个单独的Date,它没有被改变。 计算复习日期 在这节,你将看到一个依据现实世界的例子。这个详细的程序计算过去一个具体的日期。例如,你阅读这篇文章,你想要记住一个印象深刻的知识点。如果你没有照片一样的记忆力,你就要定期的复习这些新资料,这将帮助你记住它。关于复习系统,Kurt Hanks 和 Gerreld L. Pulsipher在他们的< Five Secrets to Personal Productivity个人能力的5个秘密>中有讨论,建议看过第一眼后马上回顾一下,然后是1天后,1个星期后,1个月后,3个月后,1年后。我的这篇文章,你要马上回顾一下,从现在算起,再就是明天,然后是1个星期,1个月,3个月,1年后。我们的程序将计算这些日期。 这个程序非常有用的,它将是PIM(Personal Information Manager个人信息管理器)的一个组成部分,并将确定复习时间。在下面的程序中,getDates()方法对一个返回日期数组(复习日期)的电子软件很有用。另外,你可以返回单独的一个日期,使用getFirstDay(),getOneDay(),getOneWeek(),getOnMonth()和getOneYear().当时间范围超出这个PIM的ReviewDates的计算范围时ReviewDates类演示了怎样计算时间段。现在,你可以容易的修改它用来处理你需要的时间段,象图书馆借书,录影带租赁和抵押计算。首先,ReviewDates类显示在下面: import java.util.*; import java.text.*; public class ReviewDates { private GregorianCalendar firstDay, oneDay, oneWeek, oneMonth, oneQuarter, oneYear; final int dateArraySize = 6; ReviewDates(GregorianCalendar gcDate) { int year = gcDate.get(GregorianCalendar.YEAR); int month = gcDate.get(GregorianCalendar.MONTH); int date = gcDate.get(GregorianCalendar.DATE); firstDay = new GregorianCalendar(year, month, date); oneDay = new GregorianCalendar(year, month, date); oneWeek = new GregorianCalendar(year, month, date); oneMonth = new GregorianCalendar(year, month, date); oneQuarter = new GregorianCalendar(year, month, date); oneYear = new GregorianCalendar(year, month, date); oneDay.add(GregorianCalendar.DATE, 1); oneWeek.add(GregorianCalendar.DATE, 7); oneMonth.add(GregorianCalendar.MONTH, 1); oneQuarter.add(GregorianCalendar.MONTH, 3); oneYear.add(GregorianCalendar.YEAR, 1); } ReviewDates() { this(new GregorianCalendar()); } public void listDates() { DateFormat df = DateFormat.getDateInstance(DateFormat.LONG); Date startDate = firstDay.getTime(); Date date1 = oneDay.getTime(); Date date2 = oneWeek.getTime(); Date date3 = oneMonth.getTime(); Date date4 = oneQuarter.getTime(); Date date5 = oneYear.getTime(); String ss = df.format(startDate); String ss1 = df.format(date1); String ss2 = df.format(date2); String ss3 = df.format(date3); String ss4 = df.format(date4); String ss5 = df.format(date5); System.out.println("Start date is " + ss); System.out.println("Following review dates are:"); System.out.println(ss1); System.out.println(ss2); System.out.println(ss3); System.out.println(ss4); System.out.println(ss5); System.out.println(); } public GregorianCalendar[] getDates() { GregorianCalendar[] memoryDates = new GregorianCalendar[dateArraySize]; memoryDates[0] = firstDay; memoryDates[1] = oneDay; memoryDates[2] = oneWeek; memoryDates[3] = oneMonth; memoryDates[4] = oneQuarter; memoryDates[5] = oneYear; return memoryDates; } public GregorianCalendar getFirstDay() { return this.firstDay; } public GregorianCalendar getOneDay() { return this.oneDay; } public GregorianCalendar getOneWeek() { return this.oneWeek; } public GregorianCalendar getOneMonth() { return this.oneMonth; } public GregorianCalendar getOneQuarter() { return this.oneQuarter; } public GregorianCalendar getOneYear() { return this.oneYear; } }
下面是使用ReviewDates类列出复习日期的例子程序: import java.util.*; public class ShowDates { public static void main(String[] args) { ReviewDates rd = new ReviewDates(); rd.listDates(); GregorianCalendar gc = new GregorianCalendar(2001, Calendar.JANUARY, 15); ReviewDates jan15 = new ReviewDates(gc); jan15.listDates(); } }
总结 这篇文章介绍了关于日期处理的3个重要的类:Date,DateFormat,GregorianCalendar.这些类让你创建日期,转换成字符串,和计算日期基本元素。处理Java中的日期问题,这篇文章只是冰山一角。可是,我在这里介绍的类和方法不仅仅是你学习高级技术的跳板,这些类和方法本身就可以处理很多通常的日期相关的任务 |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。