科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道JAVA基础应用: 处理Java中的日期问题 (3)

JAVA基础应用: 处理Java中的日期问题 (3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

处理Java中的日期问题

作者:cyber3 来源:赛迪网技术社区 2007年10月31日

关键字: 日期 JAVA基础

  • 评论
  • 分享微博
  • 分享邮件

日期处理

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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章