`
liuwei1981
  • 浏览: 770569 次
  • 性别: Icon_minigender_1
  • 来自: 太原
博客专栏
F8258633-f7e0-30b8-bd3a-a0836a5f4de5
Java编程Step-by...
浏览量:160854
社区版块
存档分类
最新评论

90.Java日期处理

 
阅读更多

1 Date类

 

 

 

在编写程序的时候,不可避免的要用到日期,要进行日期方面的处理。在Java中,提供了一个用于日期(包括时间)处理的类Date,这个类位于java.util包中。这个类在JDK1.0开始就存在了。下面我们来看一下如何使用java.util.Date类来处理日期。

虽然在Date中定义了6个构造器,但是,其中的四个已经变成了Deprecated了,也就是说,这四个构造器已经不被推荐使用了。剩下的两个构造器分别为:
Date():生成一个代表当前时间的日期对象
Date(long date):根据指定的参数生成一个日期对象,其中的long类型的参数表示从格林威治标准时间(Greenwich Mean Time,GMT)1970年1月1日 00:00:00秒以来的毫秒数。


和构造器的命运一样,在Date中的大部分方法,到现在已经被标为Deprecated了,这也可以看出JDK1.0设计上存在的诸多缺陷。

 

下面是一些常用的未被Deprecated的方法:
boolean after(Date when):测试该日期是否比参数中指定的的日期早
boolean before(Date when):测试该日期是否比参数中指定的日期迟
long getTime():得到从格林威治标准时间1970年1月1日 00:00:00到这个Date对象所表示的日期之间的相隔的时间,单位为毫秒
void setTime(long date):设置这个Date对象表示的时间,参数为从格林威治标准时间1970年1月1日 00:00:00到需要设置的日期之间的毫秒数


2 Calendar类

 

 

正是因为Date设计上的缺陷,所以在JDK1.1以后,基本上就不使用这个类来处理日期和时间了,取而代之的是一个更加成熟完善的类Calendar,它也位于java.util包中。
 

 

Calendar是一个抽象类,用来表示日历的概念。因为它是一个抽象类,所以我们不能使用它的构造器来直接实例化它。

 

但是,在这个类中,提供了很多的静态方法getInstance(),可以让我们轻松的获得Calendar类型的对象(准确的说,这个方法获得的是一个Calendar的子类GregorianCalendar的实例,GregorianCalendar表示的是我们通常所说的阳历),我们首先来看这些方法:
Calendar getInstance():获得一个默认时区、默认地点(Locale)的Calendar对象。
Calendar getInstance(Locale locale):获得一个默认时区,指定地点(Locale)的Calendar对象
Calendar getInstance(TimeZone tz):获得一个指定时区,默认地点(Locale)的Calendar对象
Calendar getInstance(TimeZone tz,Locale locale):获得一个指定时区,指定地点(Locale)的Calendar对象
当然,也可以使用GregorianCalendar的构造器来获得对应的GregorianCalendar实例。

下面我们来看一下Calendar的常用的方法:


int add(int field,int value):改变对应的field的值,注意在这里之所以是“改变”而不是“增加”,是因为除了增加外,还可以减少对应field的值,只要给它一个负值就可以了。另外也没有对应的minus()方法或者substract()方法进行减少的运算,这个方法有3点需要注意:
当被修改的field超出它所能接受的值的范围时,比它大的field将会自动修正成可接受的值,这有点类似于我们做算术运算时候的“进位”:当个位为9的时候,再加上大于等于1的值,将会往十位进1。但是和算术运算略有不同的是,不用的field发生进位的“进制”不同,如日期超过28(2月份)、29(闰2月)、30、31都可能,而分钟是60等等。例如,在表示2006-5-31的Calendar对象上调用add(Calendar.DAY_OF_MONTH,2),将会得到一个表示2006-6-2的值,而当在它上面调用add(Calendar.DAY_OF_MONTH,42)的时候,将会得到表示2006-7-11的值。

当field的值发生改变的时候,比它小的field的值也可能会发生改变,因为当field发生改变的时候,它的最大值和最小值均可能发生改变,此时,更小的field中的值会调整到尽可能和所期望的值靠近的一个值。例如,在表示2006-5-31日的Calendar对象上调用add(Calendar.MONTH,1),除了月份会变成6月份以外,因为6月没有31日,所以日期这个field也会自动调整到30日


Calendar上调用add()方法的时候,将会马上改变Calendar的毫秒数和所有field


void roll(int field,int value):和add()方法类似,区别在于,即使加上value后对应的field值已经超出了它所能表示的最大范围,也不会改变更大的field的值


int get(int field):根据指定的field,返回相应的时间值。通常,参数field使用Calendar的静态常量来表示,例如:想得到当前的月份,可以使用方法get(Calendar.MONTH)来获得


int getActualMaximum(int field):获得指定的时间字段(field)所能表示的最大值,例如,如果使用getActualMaximum(Calendar.MONTH),将会得到一个11的值,表示月份最大值为11,注意,在Calendar中,月份是从0开始计算的,也就是说,1月份对应的数值是0,12月份对应的数值是11


int getActualMinimum(int field):获得指定的时间字段(field)所能表示的最小值,例如,如果使用getActualMinimum(Calendar.DAY_OF_WEEK),将会得到一个1的值,表示星期的最小值为1


int getFirstDayOfWeek():获得表示星期的第一天的数值


java.util.Date getTime():获得一个这个Calendar所表示的日期的对应的Date类型的值


long getTimeInMillis():获得以毫秒表示的时间值


void set(int field,int value):给一个对应的字段field设置一个值,例如,将日期设置成25号,可以调用set(Calendar.DAY_OF_MONTH,25)


void set(int year,int month,int day):设置年、月、日,这里需要注意的是月份是从0开始的


void set(int year,int month,int day,int hour,int minute):设置年、月、日、时、分


void set(int year,int month,int day,int hour,int minute,int secondd):设置年、月、日、时、分、秒


void setTime(Date time):将Calendar对象的当前时间设置成Date表示的值


void setTimeInMillis(long time):设置Calendar对象的当前时间为指定time的值


提示:
 set()方法和add()/roll()方法有一个重要的不同点:set()方法除了将相关的field的值改成新的值外,它会设置一个内部成员变量,用于标示Calendar字段的改变,尽管Calendar字段f是立即更改的,但是它所代表的时间值却不会马上改变,而是会在下次调用get()/getTime()/getTimeInMillis()/add()/roll()时才会重新计算。


下面我们来看一些Calendar的例子。

import java.util.*;

public class TestCalendar {
 public static void main(String[] args) {
  Calendar cal1 = Calendar.getInstance();
  cal1.set(2006, 5, 30, 0, 0, 0); // 2006-6-30
  cal1.add(Calendar.DAY_OF_MONTH, 32);
  System.out.println("月份:" + cal1.get(Calendar.MONTH));
  System.out.println("日期:" + cal1.get(Calendar.DAY_OF_MONTH));
 }
}


这个程序将会打印出如下的信息:
月份:7
日期:1


3 TimeZone类

 

 

 

在地理上,地球被划分为24个时区,中国北京时间属于东八区,而程序中对于时间的默认实现是以格林威治时间为标准,这样就产生了八个小时的时差,所以为了让你的程序更加通用,我们必须明确说明该时间是哪个时区的时间。在Java中,有一个类TimeZone用于表示时区的概念。

 

 


TimeZone是一个抽象类,它表示的是一个时区的概念。我们可以使用这个抽象类上面的静态方法getDefault()来获得程序所运行机器上的默认时区,这个默认时区通常可以通过修改操作系统的相关配置来调整。


在TimeZone上还有一些有用的方法,我们可以通过它们来获得一些相关的信息:


String[] getAvailableIDs()/getAvailableIDs(int offset):获得所有有效的时区ID。时区ID是用于标示一个时区的值,例如,北京时间的ID其实是Asia/Shanghai。参数offset表示偏移格林威治时间的时差。
String getID():获得对应此TimeZone的ID。
String getDisplayName():获得对应时区的显示名称,例如,北京时间的显示名称为“中国标准时间”。


我们来看一个TimeZone的例子。

import java.util.*;

public class TestTimeZone {
 public static void main(String[] args) {
  TimeZone tz = TimeZone.getDefault();
  System.out.println("ID是:" + tz.getID());
  System.out.println("显示名称是:" + tz.getDisplayName());
 }
}


这个程序中,我们首先使用TimeZone的静态方法getDefault()获得表示当前操作系统得默认时区,然后使用getID()和getDisplayName()来分别获得这个时区的ID和显示名。


编译运行这个程序可以得到如下输出:
ID是:Asia/Shanghai
显示名称是:中国标准时间

分享到:
评论
1 楼 尘土飞扬 2016-12-06  
终于清楚了Date和Calendar的来龙去脉
谢谢

相关推荐

    DateHandler.java日期处理类Java文件下载.rar

    DateHandler.java日期处理类Java文件下载,有些功能很不错哦,比如计算是否是季度末、计算从现在开始几天后的时间、得到当前时间,用于文件名,使用yyyyMMddHHmmss格式、比较日期,与现在-N天的日期对比、比较日期,...

    UnixFTPEntryParser.java和FTPTimestampParserImplExZH.java

    默认的实现可能不支持某些非英文或非ISO日期格式,所以`FTPTimestampParserImplExZH.java`可能是对这个功能的扩展,以适应中文日期格式,比如农历日期或者包含中文字符的日期表示。 在实际开发中,如果你的FTP...

    java日期处理大全

    ### Java日期处理大全:掌握时间的艺术 在Java编程中,日期和时间的处理是不可或缺的一部分,尤其是在涉及到数据记录、时间戳、定时任务等场景时。本文将深入探讨Java中的日期处理技术,涵盖从基础到进阶的各种技巧...

    java.util.Date与java.sql.Date互转及字符串转换为日期时间格式.docx

    在Java编程语言中,处理日期和时间时经常使用到`java.util.Date`和`java.sql.Date`这两个类。它们虽然名字相似,但在实际应用中有很大的区别。 - **`java.util.Date`**:这个类提供了创建和操作日期/时间的功能,它...

    EasyTime.java 轻松把握日期处理

    1. java日期时间工具类,基于 java.util.Calendar。 2. 提供常用静态方法如快速获取年/月/日初始及终末时间,快速加减年/月/日/时/分/秒,日期解析、格式化输出、严格验证日期格式等。 3. 连续操作时推荐实例化。...

    DateUtil.java 时间日期处理工具类

    包含"yyyy-MM-dd"、"yyyy-MM-dd HH:mm:ss"、"yyyyMMdd"、"yyyyMMddHHmmss"、"yyyy-MM"、"yyyyMM"等时间格式的转换。 其中: 1.String转Timestamp stringToTimestamp(String dateStr); 2.比较传入时间与当前时间前一...

    java日期处理总结

    java中关于日期处理的总结,包含各种日期格式之间的转java.util.Date(已经不提倡使用,该类的方法比较少) java.util.Calendar(抽象类) java.util.GregorianCalendar(是Calendar的子类,日期处理时候经常使用该类)****...

    Util.java 一些公共的Java方法

    从给定的文件信息来看,`Util.java`主要关注以下几个方面的功能:日期时间处理、字符串操作、分页逻辑以及数字格式化。下面,我们将详细探讨这些知识点。 ### 1. 日期时间处理 #### a. 时间区设置 在`Util.java`...

    Java开发技术大全(500个源代码).

    示例描述:本章学习Java的异常处理。 demoException_1.java 异常示例1 demoException_2.java 异常示例2 demoException_3.java 异常示例3 demoException_4.java 异常示例4 demoException_5.java 异常示例5 ...

    DateUtils.java——日期处理

    属于时间转换工具类文件,其中包含格式转换,时区转换,时间计算等。

    ComUtils.java.zip

    在Java开发中,这样的工具类通常会包含字符串处理、日期时间操作、集合操作、IO流处理等常用方法。通过分析这个文件,我们可以学习到如何编写高效且易于维护的工具类,同时也可以借鉴其中的编程技巧和最佳实践。 ...

    java语言日期处理大全

    以下是一些关于Java日期处理的关键知识点,这些知识点在给定的文件中有所提及: 1. **获取当前日期**: Java通过`java.util.Date`类可以获取服务器上的当前日期。创建一个Date对象即会返回当前系统时间,如`Date ...

    Java中日期处理的代码

    根据给定的文件标题、描述、标签以及部分内容,我们可以总结出以下有关 Java 日期处理的知识点: ### 1. 导入必要的包 在 Java 中处理日期时,我们需要导入一些必要的包来支持日期时间的格式化、解析等功能。示例...

    java日期处理

    以上就是基于给定文件信息整理出的Java日期处理相关知识点,包括如何获取当前时间、不同格式的时间转换以及在JavaScript中获取当前时间等。这些知识点是Java编程中处理日期时间的基础,对于从事软件开发的人来说非常...

    java工具类 utils.zip

    "java工具类 utils.zip" 提供了一系列实用的工具类,涵盖了日期处理、字符串操作、JSON解析、Spring Bean操作、加密解密、Base64编码、图像处理、随机数生成以及正则表达式等多个方面。下面我们将逐一探讨这些工具类...

    java处理日期合并

    ### Java处理日期合并知识点 #### 一、背景与概述 在日常工作中,我们经常会遇到需要对一系列的时间段进行处理的情况,比如安排会议时间、统计员工请假时间等。这些时间段往往存在重叠的情况,如何有效地合并这些...

    OReilly.Modern.Java.Recipes.Simple.Solutions.to.Difficult.Problems.in.Java

    - **日期与时间API**:取代了旧的`java.util.Date`和`java.util.Calendar`,提供了更强大且易于使用的`java.time`包。 - **Optional类**:用于处理可能为空的对象,避免空指针异常,提高代码的安全性。 2. **Java...

    java使用stream对日期排序

    在Java 8之前,我们通常使用`java.util.Date`和`java.text.SimpleDateFormat`来处理日期。然而,这些类存在一些设计上的问题,因此Java 8引入了新的日期时间API,包括`java.time.LocalDate`, `java.time....

    JAVA Swing日期选择控件datepicker

    总结来说,Java Swing的DatePicker组件通过第三方库提供了一个方便的方式来处理日期选择,它可以极大地提升用户体验。开发者需要了解如何导入和使用这个库,创建DatePicker实例,定制其外观和行为,并将其集成到GUI...

Global site tag (gtag.js) - Google Analytics