文档章节

Java日期处理

cwsone
 cwsone
发布于 2012/05/31 14:54
字数 1714
阅读 205
收藏 0

一、Java中的日期概述
        日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式都是非常复杂的问题。
Java中日期的经常有以下五个方面:
1)创建日期
2)日期格式化显示
3)日期的转换(主要是和字符串之间的相互转换)
4)日期中年、月、日、时、分、秒、星期、月份等获取。
5)日期的大小比较、日期的加减。
        在Java中,操作日期主要涉及到一下几个类:

  1. java.util.Date        类 Date 表示特定的瞬间,精确到毫秒。从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和分析日期字符串。Date 中的把日期解释为年、月、日、小时、分钟和秒值的方法已废弃。
  2. java.text.DateFormat(抽象类)        DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并分析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、分析(文本-> 日期)和标准化。将日期表示为 Date 对象,或者表示为从 GMT(格林尼治标准时间)1970 年,1 月 1 日 00:00:00 这一刻开始的毫秒数。
  3. java.text.SimpleDateFormat(DateFormat的直接子类)        SimpleDateFormat 是一个以与语言环境相关的方式来格式化和分析日期的具体类。它允许进行格式化(日期 -> 文本)、分析(文本 -> 日期)和规范化。
            SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。但是,仍然建议通过 DateFormat 中的 getTimeInstance、getDateInstance 或 getDateTimeInstance 来新的创建日期-时间格式化程序。
  4. java.util.Calendar(抽象类)        Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
            与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化。
  5. java.util.GregorianCalendar(Calendar的直接子类)        GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家使用的标准日历系统。
            GregorianCalendar 是一种混合日历,在单一间断性的支持下同时支持儒略历和格里高利历系统,在默认情况下,它对应格里高利日历创立时的格里高利历日期(某些国家是在 1582 年 10 月 15 日创立,在其他国家要晚一些)。可由调用方通过调用 setGregorianChange() 来更改起始日期。

二、Java中的日期处理
1. Calendar和Date的转化

Java代码

import java.text.SimpleDateFormat; 

import java.util.Calendar; 

import java.util.Date; 

Calendar cal=Calendar.getInstance();  

cal.clear();  

cal.set(Calendar.YEAR,2008); //year 为 int

cal.set(Calendar.MONTH,10);//Calendar对象默认一月为0,实际值加1          

int day=cal.getActualMaximum(Calendar.DAY_OF_MONTH);//本月份的天数

System.out.println(day); 

Date date = cal.getTime(); 

SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss"); 

String time = sdf.format(date); 

System.out.println(time); 

Reults:

Java代码

30

2008年11月01日 12:00:00

注:在使用set方法之前,必须先clear一下,否则很多信息会继承自系统当前时间
(1) Calendar转化为Date

Java代码

Calendar cal=Calendar.getInstance();  

Date date=cal.getTime(); 

(2) Date转化为Calendar

Java代码

Date date=new Date();  

Calendar cal=Calendar.getInstance();  

cal.setTime(date);  

3.格式化输出日期时间 (这个用的比较多)

Java代码

Date date=new Date();  

SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  

String time=df.format(date);  

System.out.println(time);  

4.计算一年中的第几星期
(1)计算某一天是一年中的第几星期

Java代码

Calendar cal=Calendar.getInstance();  

cal.set(Calendar.YEAR, 2009);  

cal.set(Calendar.MONTH,0); //一月

cal.set(Calendar.DAY_OF_MONTH, 4);  

int weekNo=cal.get(Calendar.WEEK_OF_YEAR);  

System.out.println(weekNo); 

Results(2009年1月4日是2009年的第几周:周日到周六算一周):

Java代码

2

(2)计算一年中的第几星期是几号

Java代码

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");  

Calendar cal=Calendar.getInstance();  

cal.set(Calendar.YEAR, 2009);  

cal.set(Calendar.WEEK_OF_YEAR, 1);  

cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);  

System.out.println(sdf.format(cal.getTime()));  

Results(2009年第1周的星期五的日期):

Java代码

2009-01-02

5.add()和roll()的用法(不太常用)
(1)add()方法

Java代码

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 

Calendar cal=Calendar.getInstance();  

cal.set(Calendar.YEAR, 2009);  

cal.set(Calendar.MONTH,9); //十月

cal.set(Calendar.DAY_OF_MONTH, 28);  

cal.add(Calendar.DATE, -4);  

Date date=cal.getTime();  

System.out.println(sdf.format(date));  

cal.add(Calendar.DATE, 4);  

date=cal.getTime();  

System.out.println(sdf.format(date)); 

Results:

Java代码

2009-10-24

2009-10-28

(2)roll方法

Java代码

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 

Calendar cal=Calendar.getInstance();  

cal.set(Calendar.YEAR, 2009);  

cal.set(Calendar.MONTH,9); //十月

cal.set(Calendar.DAY_OF_MONTH, 1); //2009-10-01

cal.roll(Calendar.DATE, -4);  

Date date=cal.getTime(); //2009-10-28

System.out.println(sdf.format(date));  

cal.roll(Calendar.DATE, 4);  

date=cal.getTime(); //2009-10-01

System.out.println(sdf.format(date)); 

Results:

Java代码

2009-10-28

2009-10-01

可见,roll()方法在本月内循环,一般使用add()方法;

6.计算两个任意时间中间的间隔天数(这个比较常用)
(1)传进Calendar对象

Java代码

public int getIntevalDays(Calendar startday, Calendar endday){ 

if(startday.after(endday)){ //如果结束日期比开始日期小,交换位置

              Calendar cal = startday; 

        startday = endday; 

        endday = cal; 

    } 

long start = startday.getTimeInMillis(); 

long end = endday.getTimeInMillis(); 

int inteval = (int)((end-start)/24*60*60*1000); 

return inteval; 

(2)传进Date对象

Java代码

public static int getIntevalDays(Date startday, Date endday){ 

if(startday.after(endday)){ //如果结束日期比开始日期小,交换位置

  Date cal = startday; 

  startday = endday; 

  endday = cal; 

long start = startday.getTime(); 

long end = endday.getTime(); 

int inteval = (int)((end-start)/24*60*60*1000); 

return inteval; 

(3)改进精确计算相隔天数的方法

Java代码

public int getDaysBetween(Calendar d1, Calendar d2) { 

if (d1.after(d2)) { 

        Calendar swap = d1; 

        d1 = d2; 

        d2 = swap; 

    } 

int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR); 

int y2 = d2.get(Calendar.YEAR); 

if (d1.get(Calendar.YEAR) != y2) { 

        d1 = (Calendar) d1.clone(); 

do { 

            days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);// 得到当年实际天数

            d1.add(Calendar.YEAR, 1); 

        } while (d1.get(Calendar.YEAR) != y2); 

    } 

return days; 

匹配最好转化成 long去比较
如:1年前日期(注意毫秒的转换)

Java代码

java.util.Date myDate=new java.util.Date();  

long myTime=(myDate.getTime()/1000)-60*60*24*365;  

myDate.setTime(myTime*1000);  

String mDate=formatter.format(myDate);  

7. String 和 Date ,Long 之间相互转换 (最常用)
字符串转化成时间类型(字符串可以是任意类型,只要和SimpleDateFormat中的格式一致即可)
通常我们取时间跨度的时候,会substring出具体时间--long-比较

Java代码

java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("M/dd/yyyy hh:mm:ss a",java.util.Locale.US);  

java.util.Date d = sdf.parse("5/13/2003 10:31:37 AM");  

long dvalue=d.getTime();  

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  

String mDateTime1=formatter.format(d);  

8. 通过时间求时间
年月周求日期

Java代码

SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM F E");  

java.util.Date date2= formatter2.parse("2003-05 5 星期五");  

SimpleDateFormat formatter3 = new SimpleDateFormat("yyyy-MM-dd");  

String mydate2=formatter3.format(date2);  

求是星期几

Java代码

mydate= myFormatter.parse("2001-1-1");  

SimpleDateFormat formatter4 = new SimpleDateFormat("E");  

String mydate3=formatter4.format(mydate);  

© 著作权归作者所有

共有 人打赏支持
下一篇: Java日期计算
cwsone
粉丝 19
博文 13
码字总数 7583
作品 0
北京
后端工程师
私信 提问
赶紧重写 Java 的时间和日期 API 吧!

最近 Java.net 的投票问题是:“在 Java 8 中实现 JSR-310(新的 Java 日期和时间 API)有多么重要? ”在这篇帖子发布的时候,对该话题已经有超过 150 条回应。其中“觉得非常重要”(53%),“...

墙头草
2012/03/27
5K
26
Java 8新的时间日期库的20个使用示例

除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使用Java 8的这套API。Java对日期,日历及时间的...

清尘V
2015/03/17
0
0
Java 8时间和日期API 20例

伴随lambda表达式、streams以及一系列小优化,Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。Java处理日期、日历和时间的方式一直为社区所诟病,将...

黄梦巍
2015/06/19
0
0
clojure 新手指南(10):与java交互

clojure是基于jvm的语言,就是说clojure会被编译成字节码被jvm执行。但是clojure能做的可不仅仅是被编译成字节码,它提供了一套API让用户与java交互。因此clojure可以直接调用java世界中那些...

凯奥斯
2013/07/07
0
1
java8中的时间处理0 - api介绍

Java 8 Date Time API是我们java开发一直寻找的时间处理工具。java从一开始设计的时间类就让人头疼,好在现在终于有了java8。 为什么我们需要这套API 只要是有这么几个理由: Java的日期和时...

davelet
2018/02/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux shell使用代理

export http_proxy=http://proxyAddress:port export http_proxy=http://proxyAddress:port

萌萌哒的小萝卜
1分钟前
0
0
Krpano 插入视频-video

hotspot-video <hotspot name="videospot" url="%SWFPATH%/plugins/videoplayer.swf" alturl="%SWFPATH%/plugins/videoplayer.js" videourl="%SWFPATH%/image/video.flv|%......

华山猛男
4分钟前
0
0
el-select使用方法及遇到数据回显的坑

<el-select v-model="temp.lang" class="filter-item" placeholder="Please select"> <el-option v-for="item in langs" :key="item.value" :label="item.label" :value="item.value"/> </el......

BraveLN
6分钟前
0
0
百度贴吧自动签到

实现百度贴吧自动签到功能 1.编写签到Python脚本 2.服务器配置定时任务执行签到脚本

MrPei
11分钟前
0
0
windows nginx

之前一直是在linux上使用nginx,今天百度了一下,发现原来nginx在windows也有软件。 最近在研究jeecg-boot,现在越来越多的框架开始采用前后分离的模式了,看来也是时候跟进了。 nginx: dow...

miaojiangmin
16分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部