======================================================
注:本文源代码点此下载
======================================================

原文来自 csdn

java统计从1970年1月1日起的毫秒的数量表示日期。也就是说,例如,1970年1月2日,是在1月1日后的86,400,000毫秒。同样的,1969年12月31日是在1970年1月1日前86,400,000毫秒。java的date类使用long类型纪录这些毫秒值.因为long是有符号整数,所以日期可以在1970年1月1日之前,也可以在这之后。long类型表示的最大正值和最大负值可以轻松的表示290,000,000年的时间,这适合大多数人的时间要求。

date 类

date类可以在java.util包中找到,用一个long类型的值表示一个指定的时刻。它的一个有用的构造函数是date(),它创建一个表示创建时刻的对象。gettime()方法返回date对象的long值。在下面的程序中,我使用date()构造函数创建一个表示程序运行时刻的对象,并且利用gettime()方法找到这个日期代表的毫秒数量:

import java.util.*;

public class now {

public static void main(string[] args) {

date now = new date();

long nowlong = now.gettime();

system.out.println("value is " + nowlong);

}

}

当我运行这个程序后,我得到972,568,255,150.快速确认一下这个数字,起码在一个合理的范围:它不到31年,这个数值相对1970年1月1日到我写这篇文章的时间来说,是合理的。计算机是这个毫秒值表示时间,人们可不愿意说" 我将在996,321,998,34见到你。"幸运的是,java提供了一个转换date对象到字符串的途径,表示成传统的形式。我们在下一节讨论dateformat类,它直观的建立日期字符串。

dateformat类

dateformat类的一个目标是建立一个人们能够识别的字符串。然而,因为语言的差别,不是所有的人希望看到严格的相同格式的日期。法国人更喜欢看到"25 decembre 2000,",但是美国人习惯看到"december 25,2000."所以一个dateformat的实例创建以后,这个对象包含了日期的显示格式的信息。如果使用用户电脑区域设置缺省的格式,你可以象下面那样,创建dateformat对象,使用getdateinstance()方法:

dateformat df = dateformat.getdateinstance();

dateformat类在java.text包中可以找到。

转换成字符串

你可以使用format()方法转换date对象为一个字符串。下面的示例程序说明了这个问题:

import java.util.*;

import java.text.*;

public class nowstring {

public static void main(string[] args) {

date now = new date();

dateformat df = dateformat.getdateinstance();

string s = df.format(now);

system.out.println("today is " + s);

}

}

在上面的代码中,展示了没有参数,使用缺省格式的getdateinstance()方法。java还提供了几个选择日期格式,你可以通过使用重载的getdateinstance(int style)获得。出于方便的原因,dateformat提供了几种预置的常量,你可以使用这些常量参数。下面是几个short, medium, long, 和full类型的示例:

import java.util.*;

import java.text.*;

public class styledemo {

public static void main(string[] args) {

date now = new date();

dateformat df =dateformat.getdateinstance();

dateformat df1 = dateformat.getdateinstance(dateformat.short);

dateformat df2 = dateformat.getdateinstance(dateformat.medium);

dateformat df3 = dateformat.getdateinstance(dateformat.long);

dateformat df4 = dateformat.getdateinstance(dateformat.full);

string s =df.format(now);

string s1 = df1.format(now);

string s2 = df2.format(now);

string s3 = df3.format(now);

string s4 = df4.format(now);

system.out.println("(default) today is " + s);

system.out.println("(short)today is " + s1);

system.out.println("(medium)today is " + s2);

system.out.println("(long)today is " + s3);

system.out.println("(full)today is " + s4);

}

}

程序输出如下:

(default) today is nov 8, 2000

(short)today is 11/8/00

(medium)today is nov 8, 2000

(long)today is november 8, 2000

(full)today is wednesday, november 8, 2000

同样的程序,在我的计算机上使用缺省设置运行后,改变区域设置为瑞典,输出如下:

(default) today is 2000-nov-08

(short)today is 2000-11-08

(medium)today is 2000-nov-08

(long)today is den 8 november 2000

(full)today is den 8 november 2000

从这里,你能看到,瑞典的月份不是大写的(虽然november还是november).还有,long和full版本在瑞典语中是一样的,但是美国英语却不同。另外,有趣的是,瑞典语单词的星期三,onsdag,没有包含在full日期里,英语却包括。

注意你能够使用getdateinstance()方法改变dateformat实例的语种;但是,在上面的例子中,是通过改变windows98的控制面板的区域设置做到的。不同的地方的区域设置不同,结果就不同,这样有好处,也有不足,java程序员应该了解这些。一个好处是java程序员可以只写一行代码就可以显示日期,而且世界不同地区的电脑运行同样的程序会有不用的日期格式。 但是这也是一个缺点,当程序员希望显示同一种格式的时--这也有可取之处,举例来说,在程序中混合输出文本和日期,如果文本是英文,我们就不希望日期格式是其他的格式,象德文或是西班牙文。如果程序员依靠日期格式编程,日期格式将根据运行程序所在电脑的区域设置不用而不同。

解析字符串

通过parse()方法,dateformat能够以一个字符串创立一个date对象。这个方法能抛出parseexception异常,所以你必须使用适当的异常处理技术。下面的例子程序通过字符串创建date对象:

import java.util.*;

import java.text.*;

public class parseexample {

public static void main(string[] args) {

string ds = "november 1, 2000";

dateformat df = dateformat.getdateinstance();

try {

date d = df.parse(ds);

}

catch(parseexception e) {

system.out.println("unable to parse " + ds);

}

}

}

在创建一个任意的日期时parse()方法很有用。我将通过另一种方法创建一个任意得日期。同时,你将看到怎样进行基本日期计算,例如计算90天后的另一天。你可以使用gregoriancalendar类来完成这个任务。

gregoriancalendar类

创建一个代表任意日期的一个途径使用gregoriancalendar类的构造函数,它包含在java.util包中:

gregoriancalendar(int year, int month, int date)

注意月份的表示,一月是0,二月是1,以此类推,是12月是11。因为大多数人习惯于使用单词而不是使用数字来表示月份,这样程序也许更易读,父类calendar使用常量来表示月份:january, february,等等。所以,创建wilbur 和 orville制造第一架动力飞机的日期(december 17, 1903),你可以使用:

gregoriancalendar firstflight = new gregoriancalendar(1903, calendar.december, 17);

出于清楚的考虑,你应该使用前面的形式。但是,你也应该学习怎样阅读下面的短格式。下面的例子同样表示december 17,1903(记住,在短格式中,11表示december)

gregoriancalendar firstflight = new gregoriancalendar(1903, 11, 17);

在上一节中,你学习了转换date对象到字符串。这里,你可以做同样的事情;但是首先,你需要将gregoriancalendar对象转换到date。要做到这一点,你可以使用gettime()方法,从它得父类calendar继承而来。gettime()方法返回gregoriancalendar相应的date对象。你能够创建gregoriancalendar对象,转换到date对象,得到和输出相应的字符串这样一个过程。下面是例子:

import java.util.*;

import java.text.*;

public class flight {

public static void main(string[] args) {

gregoriancalendar firstflight = new gregoriancalendar(1903, calendar.december, 17);

date d = firstflight.gettime();

dateformat df = dateformat.getdateinstance();

string s = df.format(d);

system.out.println("first flight was " + s);

}

}

有时候创建一个代表当前时刻的gregoriancalendar类的实例是很有用的。你可以简单的使用没有参数的gregoriancalendar构造函数,象这样:

gregoriancalendar thisday = new gregoriancalendar();

一个输出今天日期的例子程序,使用gregoriancalendar对象:

import java.util.*;

import java.text.*;

class today {

public static void main(string[] args) {

gregoriancalendar thisday = new gregoriancalendar();

date d = thisday.gettime();

dateformat df = dateformat.getdateinstance();

string s = df.format(d);

system.out.println("today is " + s);

}

}

注意到,date()构造函数和gregoriancalendar()构造函数很类似:都创建一个对象,条件简单,代表今天。

日期处理

gregoriancalendar类提供处理日期的方法。一个有用的方法是add().使用add()方法,你能够增加象年,月数,天数到日期对象中。要使用add()方法,你必须提供要增加的字段,要增加的数量。一些有用的字段是date, month, year, 和 week_of_year。下面的程序使用add()方法计算未来80天的一个日期。在jules的是一个重要的数字,使用这个程序可以计算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在他们的中有讨论,建议看过第一眼后马上回顾一下,然后是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();

}

}

作者:syxchina

出处:http://syxchina.cnblogs.com、

http://hi.baidu.com/syxcs123

本文版权归作者、博客园和百度空间共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则作者会诅咒你的。

绿色通道:好文要顶关注我收藏该文与我联系

======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/

syx278250658相关推荐

  1. 转载: 8天学通MongoDB——第七天 运维技术

    这一篇我们以管理员的视角来看MongoDB,作为一名管理员,我们经常接触到的主要有4个方面: 1.  安装部署 2.  状态监控 3.  安全认证 4.  备份和恢复, 下面我们就一点一点的讲解. 一 ...

  2. 如鹏网C语言也能干大事精华帖

    如鹏网 http://www.rupeng.com/ 1.尘封 俄罗斯方块    hity 俄罗斯方块    小马_xiao   由写俄罗斯方块引发的种种 2.Diao_Cow   很funny的程序 ...

  3. java cpu_java获得CPU使用率,系统内存,虚拟机内存等情况

    JXM:Monitoring and Management Interface for the Java™ Platform 通过jmx可以监控vm内存使用,系统内存使用等 以下是网上某博客代码,特点 ...

  4. windows phone7天气预报源代码

    分享到... 复制网址 邮件 QQ空间 新浪微博 腾讯微博 微信 人人网 易信 网易微博 搜狐微博 QQ好友 开心网 飞信 豆瓣 一键分享 查看更多(122) 这是什么工具? JiaThis 韩弈风 ...

  5. Java方向如何准备BAT技术面试答案(汇总版)

    转自:http://www.jianshu.com/p/1f1d3193d9e3 原文链接:Java方向如何准备BAT技术面试答案(汇总版) 这个主题的内容之前分三个篇幅分享过,导致网络上传播的比较分 ...

最新文章

  1. Spark Stream整合flum和kafka,数据存储在HBASE上,分析后存入数据库
  2. java自定义日志级别_自定义log4j日志级别
  3. 噪音曲线图测试软件,利用示波器统计工具分析有噪声信号之测量统计和余晖图...
  4. 七、matplotlib的使用
  5. 95-230-022-源码-WordCount走读-获取JobGraph
  6. Given two binary trees, write a function to check if they areequal or not.
  7. 不会写代码也可以, 手把手教你制作炫酷生日祝福网页(程序员专属情人节表白网站)
  8. Port vlan Tag vlan
  9. gif 格式图片详解
  10. 华为智慧屏鸿蒙os的特点,华为智慧屏功能特点一览
  11. Mac 如何删除应用、软件
  12. 都挺好 苏大强C位出道的不只表情包 还有大眼袋
  13. 文献阅读—A detection algorithm for cherry fruits based on the improved YOLO-v4 model
  14. 力扣中国(LeetCode) 算法题 有效独数(python)
  15. MPP大规模并行计算数据库与分布式数据库的区别
  16. bat批处理开发-wifi联网系列(5):wifi稳定性分析之日期时间比较及奇特数字的坑
  17. 基于ROS2开发的点云体素化
  18. 【ubuntu20.04】安装百度输入法和搜狗输入法之后,有登陆界面,登陆之后黑屏,只有鼠标可以移动,点击无效,长时间等待提示“连接失败,请注销后重试”
  19. 战地4高性能服务器,战地4服务器推荐配置
  20. html解析json天气预报数据,国家气象局天气预报JSON数据接口详解

热门文章

  1. python灰色波浪线,PyCharm关闭碍眼的波浪线图文详解
  2. 泛读论文:Person-reID 行人重识别合集
  3. Java面向对象程序设计(第二版)袁绍欣 第九章课后习题答案
  4. java 取款机_JAVA ATM提款机程序
  5. linux 排程命令,linux 任务管理与调度
  6. 算法竞赛入门经典 每日一题(郊区春游)
  7. python判断成年_用python判断你是青少年还是老年人
  8. 无线接入控制服务器(ac),无线AP控制器是什么?无线AP与无线AC的区别
  9. ios 计算两个时间相差秒数_iOS NSDate时间换算
  10. Elasticsearch的安装,以及Springboot整合Elasticsearch