java中的时间类的处理.docx
- 文档编号:10569820
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:34
- 大小:98.17KB
java中的时间类的处理.docx
《java中的时间类的处理.docx》由会员分享,可在线阅读,更多相关《java中的时间类的处理.docx(34页珍藏版)》请在冰点文库上搜索。
java中的时间类的处理
程序就是输入——>处理——>输出。
对数据的处理是程序员需要着重注意的地方,快速、高效的对数据进行处理时我们的追求。
其中,时间日期的处理又尤为重要和平凡,此次,我将把Java中的时间日期处理方式进行简单的解析,为自己以后的学习做一个备忘,也为初学者做一个借鉴。
时间,英文Time;日期,英文Date;日历,英文Calendar。
Java中注重语义化,也是用以上的名称对时间日期函数和相关类进行命名。
我们将以Java自带的时间日期类和其中的处理函数进行分析。
一、与时间日期有关的类。
java.util.Date。
实现类,其对象具有时间、日期组件。
java.util.Calendar。
抽象类,其对象具有时间、日期组件。
java.sql.Date。
实现类,其对象具有日期组件。
java.sql.Time。
实现类,其对象具有时间组件。
java.sql.Timestamp。
实现类,其对象具有时间日期组件。
java.text.DateFormat。
抽象类,其对象格式化时间日期。
java.text.DateFormatSymbols。
实现类,其对象为格式化时间日期提供参数。
(sun.util.*canlender*.*。
System。
Local。
TimeZone等)
二、类之间的关系。
我们通过图解和部分jdk源代码来说明。
(上图有几处错误,Calendar拼写错误。
)
以上的图列出了部分常用的类。
我们一般会使用的类java.util.Date、java.util.Calendar、java.sql.Timestamp、java.text.DateFormat进行时间日期操作,因为他们有完全的时间日期组件和全面的格式化功能。
值得注意的是:
java.sql.Date没有时间组件!
而java.sql.Time没有日期组件!
再次提醒。
什么意思呢?
大家请看下面的代码:
1publicstaticvoidmain(String[]args){
2/*
3*以下代码用于向大家展示各个时间日期类对象的包含组件。
4*/
5java.sql.DatesqlDate=newjava.sql.Date(System.currentTimeMillis());
6System.out.println(sqlDate.toString());//输出结果:
2012-09-01
7java.sql.TimesqlTime=newjava.sql.Time(System.currentTimeMillis());
8System.out.println(sqlTime.toString());//输出结果:
12:
35:
11
9java.sql.TimestampsqlTimestamp=newjava.sql.Timestamp(System.currentTimeMillis());
10System.out.println(sqlTimestamp.toString());//输出结果:
2012-09-0112:
36:
33.544
11java.util.DateutilDate=newjava.util.Date(System.currentTimeMillis());
12System.out.println(utilDate.toString());//输出结果:
SatSep0112:
37:
34CST2012
13java.util.Calendarcl=java.util.Calendar.getInstance();
14System.out.println(cl.getTime().toString());//输出结果:
SatSep0112:
39:
51CST2012
15}
可以看到:
java.util.Date、java.util.Calendar、java.sql.Timestamp具有的时间日期组件(而且他们具有无参构造方法),java.sql.Date和java.sql.Time只有时间或日期组件。
为了证实以上言论,我将部分jdk源码贴出来供大家参考。
Java语言的Calendar,GregorianCalendar(日历),Date(日期),和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分.日期是商业逻辑计算一个关键的部分.所有的开发者都应该能够计算未来的日期,定制日期的显示格式,并将文本数据解析成日期对象。
学习日期,日期格式,日期的解析和日期的计算。
我们将讨论下面的类:
1、 具体类(和抽象类相对)java.util.Date
2、 抽象类java.text.DateFormat和它的一个具体子类,java.text.SimpleDateFormat
3、 抽象类java.util.Calendar和它的一个具体子类,java.util.GregorianCalendar
具体类可以被实例化,但是抽象类却不能.你首先必须实现抽象类的一个具体子类.
1. java.util.Date及其格式化
Date类从Java开发包(JDK)1.0就开始进化,当时它只包含了几个取得或者设置一个日期数据的各个部分的方法,比如说月,日,和年.这些方法现在遭到了批评并且已经被转移到了Calendar类里去了,我们将在本文中进一步讨论它.这种改进旨在更好的处理日期数据的国际化格式.就象在JDK1.1中一样,Date类实际上只是一个包裹类,它包含的是一个长整型数据,表示的是从GMT(格林尼治标准时间)1970年,1月1日00:
00:
00这一刻之前或者是之后经历的毫秒数.
1.1.创建java.util.Date
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年的时间,这适合大多数人的时间要求。
让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子.这个时间通常被称为Java虚拟机(JVM)主机环境的系统时间.
importjava.util.Date;
publicclassDateExample1{
publicstaticvoidmain(String[]args){
//Getthesystemdate/time
Datedate=newDate();
//打印出具体的年,月,日,小时,分钟,秒钟以及时区
System.out.println(date.getTime());
}
}
在星期六,2001年9月29日,下午大约是6:
50的样子,上面的例子在系统输出设备上显示的结果是1001803809710.在这个例子中,值得注意的是我们使用了Date构造函数创建一个日期对象,这个构造函数没有接受任何参数.而这个构造函数在内部使用了System.currentTimeMillis()方法来从系统获取日期.
//1年前日期
java.util.DatemyDate=newjava.util.Date();
longmyTime=(myDate.getTime()/1000)-60*60*24*365;
myDate.setTime(myTime*1000);
StringmDate=formatter.format(myDate);
//明天日期
myDate=newjava.util.Date();
myTime=(myDate.getTime()/1000)+60*60*24;
myDate.setTime(myTime*1000);
mDate=formatter.format(myDate);
//两个时间之间的天数
SimpleDateFormatmyFormatter=newSimpleDateFormat("yyyy-MM-dd");
java.util.Datedate=myFormatter.parse("2003-05-1");
java.util.Datemydate=myFormatter.parse("1899-12-30");
long day=(date.getTime()-mydate.getTime())/(24*60*60*1000);
//加半小时
SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-ddhh:
mm:
ss");
java.util.Datedate1=format.parse("2002-02-2823:
16:
00");
longTime=(date1.getTime()/1000)+60*30;
date1.setTime(Time*1000);
Stringmydate1=formatter.format(date1);
//年月周求日期
SimpleDateFormatformatter2=newSimpleDateFormat("yyyy-MMFE");
java.util.Datedate2=formatter2.parse("2003-055星期五");
SimpleDateFormatformatter3=newSimpleDateFormat("yyyy-MM-dd");
Stringmydate2=formatter3.format(date2);
//求是星期几
mydate=myFormatter.parse("2001-1-1");
SimpleDateFormatformatter4=newSimpleDateFormat("E");
Stringmydate3=formatter4.format(mydate);
1.2.Date格式化
能以一种用户明白的格式来显示这个日期呢?
在这里类java.text.SimpleDateFormat和它的抽象基类java.text.DateFormat。
那么,现在我们已经知道了如何获取从1970年1月1日开始经历的毫秒数了.我们如何才format就派得上用场了.
//我们能不能用下面的代码构件出2001/8/88:
8
importjava.io.*;
importjava.util.*;
publicclassWhatIsDate
{
publicstaticvoidmain(String[]args){
Datedate=newDate(2001,8,8,8,8,8);
System.out.println(date);
}
}
Java的编译器竟然报如下信息(SunJDK1.3,Windows2000中文下)
注意:
WhatIsDate.java使用或覆盖一个不鼓励使用的API。
注意:
使用-deprecation重新编译,以得到详细信息。
!
那么Date对象究竟是为了满足哪个需求呢?
看来它不是用来实现基于年/月/日小时:
分钟的时间表述。
我们查看Java的文档,我们看到有getTime()方法,它返回的竟然是一个long值。
文档进一步又告诉我们这个值代表了当前系统的时间离1970/1/10:
0的毫秒差,而且是在GMT时区下(也被称为EPOC)。
如果我们指定的时间是在此之前的,那它将返回一个负数值。
这个发现让我们对Date对象有了一个全新的认识-Date存放的是与EPOC的偏差值。
换而言之我们也可通过long类型来表示时间?
对了,这个猜想是得到了Java的支持:
//第二种获得当前时间的方法
longdateInMilliSeconds=System.currentTimeMillis();
//这时候打印出的只是一串数字而已
System.out.println(dateInMilliSeconds);
对程序执行效率敏感的程序员可以发现这个方法只是生成一个Java的原始类型(primitivetype)long,不需要实例化一个对象。
因此如果我们对时间的处理只是在内部进行时,可以用long来代替Date对象。
最典型的应用就是在一段代码开始和结束时,分别获得系统当前的时间,然后计算出代码执行所需的时间(微秒级)。
longstart=System.currentTimeMillis();
//代码段
System.out.println("需要"+(System.currentTimeMillis()-start)+"微秒");
那么当我们要把这个long值已更为友好的表现形式显示处理的时候,我们可以用它来构造Date对象:
Datedate=newDate(dateInMilliSeconds);
System.out.println(date);
我们看到了在Java中对时间最为基本的表示,有通过对EPOC的偏差值进行处理。
Date对象是对它的一个对象的封装。
我们同时也看到了,在现时世界中我们对时间的描述通常是通过"某年某月某日某时某分"来定义的。
Date的显示(实际上是toString()方法)描述了这些信息,但Java并不建议我们用这种方式直接来构件Date对象。
因此我们需要找出哪个对象可以实现这个需求。
这就是我们下面就要讲述的Calendar对象的功能。
在我们进一步研究Calendar之前,请记住Date只是一个对long值(基于GMT时区)的对象封装。
它所表现出来的年/月/日小时:
分钟时区的时间表述,只是它的toString()方法所提供的。
千万不要为这个假象所迷惑。
假如我们希望定制日期数据的格式,比方星期六-9月-29日-2001年.下面的例子展示了如何完成这个工作:
importjava.text.SimpleDateFormat;
importjava.util.Date;
publicclassDateExample2{
publicstaticvoidmain(String[]args){
SimpleDateFormatbartDateFormat=newSimpleDateFormat("EEEE-MMMM-dd-yyyy");Datedate=newDate();
System.out.println(bartDateFormat.format(date));
}
}
只要通过向SimpleDateFormat的构造函数传递格式字符串"EEE-MMMM-dd-yyyy",我们就能够指明自己想要的格式.你应该可以看见,格式字符串中的ASCII字符告诉格式化函数下面显示日期数据的哪一个部分.EEEE是星期,MMMM是月,dd是日,yyyy是年.字符的个数决定了日期是如何格式化的.传递"EE-MM-dd-yy"会显示Sat-09-29-01.请察看Sun公司的Web站点获取日期格式化选项的完整的指示.
1.3.文本数据解析成日期对象
假设我们有一个文本字符串包含了一个格式化了的日期对象,而我们希望解析这个字符串并从文本日期数据创建一个日期对象.我们将再次以格式化字符串"MM-dd-yyyy"调用SimpleDateFormat类,但是这一次,我们使用格式化解析而不是生成一个文本日期数据.我们的例子,显示在下面,将解析文本字符串"9-29-2001"并创建一个值为001736000000的日期对象.
通过parse()方法,DateFormat能够以一个字符串创立一个Date对象。
这个方法能抛出ParseException异常,所以你必须使用适当的异常处理技术。
例子程序:
importjava.text.SimpleDateFormat;
importjava.util.Date;
publicclassDateExample3{
publicstaticvoidmain(String[]args){
//Createadateformatterthatcanparsedatesof
//theformMM-dd-yyyy.
SimpleDateFormatbartDateFormat=newSimpleDateFormat("MM-dd-yyyy");
//Createastringcontainingatextdatetobeparsed.
StringdateStringToParse="9-29-2001";
try{
//Parsethetextversionofthedate.
//Wehavetoperformtheparsemethodina
//try-catchconstructincasedateStringToParse
//doesnotcontainadateintheformatweareexpecting.
Datedate=bartDateFormat.parse(dateStringToParse);
//Nowsendtheparseddateasalongvalue
//tothesystemoutput.
System.out.println(date.getTime());
}catch(Exceptionex){
System.out.println(ex.getMessage());
}
}
}
1.4.使用标准的日期格式化过程
既然我们已经可以生成和解析定制的日期格式了,让我们来看一看如何使用内建的格式化过程.方法DateFormat.getDateTimeInstance()让我们得以用几种不同的方法获得标准的日期格式化过程.在下面的例子中,我们获取了四个内建的日期格式化过程.它们包括一个短的,中等的,长的,和完整的日期格式.
importjava.text.DateFormat;
importjava.util.Date;
publicclassDateExample4{
publicstaticvoidmain(String[]args){
Datedate=newDate();
DateFormatshortDateFormat=DateFormat.getDateTimeInstance(
DateFormat.SHORT,DateFormat.SHORT);
DateFormatmediumDateFormat=DateFormat.getDateTimeInstance(
DateFormat.MEDIUM,DateFormat.MEDIUM);
DateFormatlongDateFormat=DateFormat.getDateTimeInstance(
DateFormat.LONG,DateFormat.LONG);
DateFormatfullDateFormat=DateFormat.getDateTimeInstance(
DateFormat.FULL,DateFormat.FULL);
System.out.println(shortDateFormat.format(date));System.out.println(mediumDateFormat.format(date));System.out.println(longDateFormat.format(date));System.out.println(fullDateFormat.format(date));
}
}
注意我们在对getDateTimeInstance的每次调用中都传递了两个值.第一个参数是日期风格,而第二个参数是时间风格.它们都是基本数据类型int(整型).考虑到可读性,我们使用了DateFormat类提供的常量:
SHORT,MEDIUM,LONG,和FULL.要知道获取时间和日期格式化过程的更多的方法和选项,请看Sun公司Web站点上的解释.
运行我们的例子程序的时候,它将向标准输出设备输出下面的内容:
9/29/018:
44PM
Sep29,20018:
44:
45PM
September29,20018:
44:
45PMEDT
Saturday,September29,20018:
44:
45PMEDT
2. Calendar日历类
首先请记住Calendar只是一个抽象类,也就是说你无法直接获得它的一个实例,换而言之你可以提供一个自己开发的Calendar对象。
那究竟什么是一个Calendar呢?
中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历、阴(农)历之分。
它们的区别在哪呢?
比如有:
月份的定义-阳`(公)历一年12个月,每个月的天数各不同;阴(农)历,每个月固定28天,每周的第一天-阳(公)历星期日是第一天;阴(农)历,星期一是第一天
实际上,在历史上有着许多种纪元的方法。
它们的差异实在太大了,比如说一个人的生日是"八月八日"那么一种可能是阳(公)历的八月八日,但也可以是阴(农)历的日期。
所以为了计时的统一,必需指定一个日历的选择。
那现在最为普及
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 中的 时间 处理