`
lokvin
  • 浏览: 164884 次
  • 性别: Icon_minigender_1
  • 来自: 地球
文章分类
社区版块
存档分类
最新评论

java 中时间和日期处理的小记

阅读更多
    经常会遇到处理时间和日期的情况,小记一下,呵呵。

     时间和日期中常用到的几个类:java.util.Date,
                            java.util.Calendar,
                            java.util.GregorainCalendar,
                            java.text.DateFormat,
                            java.text.SimpleDateFormat

java.util.Date :

表示特定瞬间,精确到毫秒
一天是 24 * 60 * 60 = 86400 秒
世界时(UT 或 UTC) , 格林威治时间 (GMT), 格林威治时(GMT)和世界时(UT)
是相等的,格林威治时(GMT) 是标准的"民间"称呼, 世界时(UT) 是相同标准的
科学称呼。UTC 和 UT 的区别是:UTC 是基于原子时钟的,UT 是基于天体观察的。
(中文版的jdk 真是好啊,跟科普教材是的,呵呵)

常用的构造方法 :

Date();

Date(long date)

(long date)  表示从标准基准时间(称为 "历元" epoch ,即 1970.1.1
00:00:00 GMT)经历的毫秒数。

还有一些构造方法已经 deprecated 了

主要的方法:(介绍几个常用的,详细的查询 jdk 文档)

boolean after(Date when)   测试日期在此日期之后。

boolean before(Date when)  测试日期在此日期之前。

Object clone()  返回此对象的副本

long getTime()  返回自 1970.1.1 00:00:00 GMT 后,此对象表示的毫秒数

void setTime(long time) 设置此 Date 对象,以表示 1970 年 1 月 1 日
00:00:00 GMT 以后 time 毫秒的时间点。

String toString() 将 Date 对象转化成以下形式的
String:dow mon dd hh:mm:ss zzz yyyy

其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。
dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。
mon 是月份 (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep,
Oct, Nov, Dec)。

dd 是一月中的某一天(01 至 31),显示为两位十进制数。
hh 是一天中的小时(00 至 23),显示为两位十进制数。
mm 是小时中的分钟(00 至 59),显示为两位十进制数。
ss 是分钟中的秒数(00 至 61),显示为两位十进制数。 60,61 是因为有"润秒"
zzz 是时区(并可以反映夏令时)。标准时区缩写包括方法 parse 识别的时区缩写。
如果不提供时区信息,则 zzz 为空,即根本不包括任何字符。
yyyy 是年份,显示为 4 位十进制数。

使用 System.currentTimeMillis() 获得当前系统时间的毫秒数

java.util.Calendar :

Calendar 类是一个抽象类.

Calendar rightNow = Calendar.getInstance();

可以使用三种方法更改日历字段:set()、add() 和 roll()。

set(f, value) 将日历字段 f 更改为 value。
此外,它设置了一个内部成员变量,以指示日历字段 f 已经被更改。尽管日历字段
f 是立即更改的,但是直到下次调用 get()、getTime()、getTimeInMillis()、
add() 或 roll() 时才会重新计算日历的时间值(以毫秒为单位)。因此,多次调
用 set() 不会触发多次不必要的计算。

add(f, delta) 将 delta 添加到 f 字段中。这等同于调用
set(f, get(f) + delta)

roll(f, delta) 将 delta 添加到 f 字段中,但不更改更大的字段。

java.util.GregorianCalendar:
GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家
使用的标准日历系统。

java.text.DateFormat:
DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并
分析日期或时间。

java.text.SimpleDateFormat:

SimpleDateFormat 是一个以与语言环境相关的方式来格式化和分析日期的具体类。
它允许进行格式化(日期 -> 文本)、分析(文本 -> 日期)和规范化。

SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。但是,
仍然建议通过 DateFormat 中的 getTimeInstance、getDateInstance 或
getDateTimeInstance 来新的创建日期-时间格式化程序。每一个这样的类方法
都能够返回一个以默认格式模式初始化的日期/时间格式化程序。可以根据需要使用
applyPattern 方法来修改格式模式。

日期和时间格式由日期和时间模式 字符串指定。
在日期和时间模式字符串中,未加引号的字母 'A' 到 'Z' 和 'a' 到 'z'
被解释为模式字母,用来表示日期或时间字符串元素。


引用

字母             日期或时间元素            表示         示例 
G                 Era 标志符               Text          AD
y                 年                       Year         1996; 96
M                 年中的月份               Month        July; Jul; 07  
w                 年中的周数               Number        27
W                 月份中的周数             Number        2
D                 年中的天数               Number        189     
d                 月份中的天数             Number         10
F                 月份中的星期             Number          2   
E                 星期中的天数             Text           Tuesday; Tue 
a                 Am/pm 标记               Text           PM 
H                 一天中的小时数(0-23)   Number          0 
k                 一天中的小时数(1-24)   Number          24 
K                am/pm 中的小时数(0-11)  Number          0
h                am/pm 中的小时数(1-12)  Number          12   
m                小时中的分钟数            Number          30 
s                分钟中的秒数              Number          55 
S                毫秒数                    Number          978
z                时区                      General time zone      Pacific Standard Time; PST; GMT-08:00  
Z                时区                      RFC 822 time zone  -0800 






引用

日期和时间模式                                   结果 
"yyyy.MM.dd G 'at' HH:mm:ss z"                   2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"                               Wed, Jul 4, '01   
"h:mm a"                                         12:08 PM 
"hh 'o''clock' a, zzzz"                          12 o'clock PM, Pacific Daylight Time 
"K:mm a, z"                                      0:08 PM, PDT 
"yyyyy.MMMMM.dd GGG hh:mm aaa"                   02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"                     Wed, 4 Jul 2001 12:08:56 -0700   
"yyMMddHHmmssZ"                                  010704120856-0700 
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"                     2001-07-04T12:08:56.235-0700 


获得当前系统的毫秒数:
package org.lokvin.example.calendar;

public class CalendarExample1 {
	
	public static void main(String[] args) {
		
		java.util.Date date = new java.util.Date();
        //获得当前系统的毫秒数,自 1970.1.1 00:00:00 GMT
		long time = System.currentTimeMillis();
		java.util.Date date1 = new java.util.Date(time);
		System.out.println("date = " + date.toString());
		System.out.println("millisecond = " + time);
		System.out.println("date1 = " + date1.toString());	
	}

}


运行结果:
引用

date = Mon Dec 04 16:01:16 CST 2006
millisecond = 1165219276771
date1 = Mon Dec 04 16:01:16 CST 2006



package org.lokvin.example.calendar;

import java.util.Calendar;
import java.util.GregorianCalendar;

public class CalendarExample2 {
	
	public static void main(String[] args) {
        //获得当前日期
		Calendar calendar = Calendar.getInstance();
		int era = calendar.get(Calendar.ERA);// 0 = BC, 1 = AD
		System.out.println("ERA = " + era);
		int year = calendar.get(Calendar.YEAR); //2006
		System.out.println("YEAR = " + year);
		int month = calendar.get(Calendar.MONTH);
		//获得当前月份, 0..11 表示 JAN..DEC
		System.out.println("Month = " + month);//0 = JAN ... 11 = DEC
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		System.out.println("Day of Month = " + day); // 1
		//获得日期在本周的天数, Sun=1, Mon=2 ... Sta=7
		int day_of_week = calendar.get(Calendar.DAY_OF_WEEK);
		System.out.println("Day of Week = " + day_of_week);
		
		//获得当前时间 12 时制是 Calendar.HOUR
		int hour12 = calendar.get(Calendar.HOUR);
		//获得 AM ,PM , 0 = AM, 1 = PM
		int ampm = calendar.get(Calendar.AM_PM);
		System.out.println("hour 12 = " + hour12);
		System.out.println("am pm = " + ampm); //0 = am , 1 = pm
		//获得当前时间 24 时制 Calendar.HOUR_OF_DAY
		int hour24 = calendar.get(Calendar.HOUR_OF_DAY);
		System.out.println("hour 24 = " + hour24);
		
		
		Calendar today = new GregorianCalendar(2006, Calendar.DECEMBER, 4);
        //Calendar.getInstance() 得到当前具体到毫秒的一个时间点
		System.out.println("calendar = " + calendar.getTime().toString());
		//通过 new GregorianCalendar(2006, Calendar.DECEMBER, 4)
		//生成的 calendar 除了指定的年,月,日其余为0(时分秒=0)
		System.out.println("today = " + today.getTime().toString());
		
		
	}

}



运行结果:
引用

ERA = 1
YEAR = 2006
Month = 11
Day of Month = 4
Day of Week = 2
hour 12 = 4
am pm = 1
hour 24 = 16
calendar = Mon Dec 04 16:22:42 CST 2006
today = Mon Dec 04 00:00:00 CST 2006


两个日期之间的比较:
package org.lokvin.example.calendar;

import java.util.Calendar;
import java.util.GregorianCalendar;

/*
 * 比较两个 calendar 对象之间的先后
 */
public class CalendarExample3 {
	
	public static void main(String[] args) {
        //日期比较
		Calendar xmas = new GregorianCalendar(2006, Calendar.DECEMBER, 25);
		Calendar newYear = new GregorianCalendar(2007, Calendar.JANUARY, 1);
	    
		//比较两个日期先后
		boolean flag = xmas.before(newYear);
		System.out.println("flag = " + flag);
		
		flag = xmas.after(newYear);
		System.out.println("flag = " + flag);
		
        //两个日期相差的毫秒数
		long timeDiffMillis = newYear.getTimeInMillis() - xmas.getTimeInMillis();
		System.out.println("time diff millis = " + timeDiffMillis);
		
        //两个日期相差的秒数
		long diffSecs = timeDiffMillis / 1000;
		System.out.println("time diff secs = " + diffSecs);
		
		//两个日期相差的分钟
		long diffMins = timeDiffMillis / (1000 * 60);
		System.out.println("time diff mins = " + diffMins);
		
		//两个日期相差的小时
		long diffHours = timeDiffMillis / (1000 * 60 * 60);
		System.out.println("time diff hours = " + diffHours);
		
		//两个日期相差的天
		long diffDays = timeDiffMillis / (1000 * 60 * 60 * 24);
		System.out.println("time diff days = " + diffDays);
			
	}

}

运行结果:

引用

flag = true
flag = false
time diff millis = 604800000
time diff secs = 604800
time diff mins = 10080
time diff hours = 168
time diff days = 7



使用Calendar 计算年龄:

package org.lokvin.example.calendar;

import java.util.Calendar;
import java.util.GregorianCalendar;

/*
 * 计算年龄
 */
public class CalendarExample4 {
   
	public static void main(String[] args) {
        //创建生日的 Calendar 对象
		Calendar birthDate = new GregorianCalendar(1979, Calendar.JULY, 7);
		Calendar today = Calendar.getInstance();
		int age = today.get(Calendar.YEAR) - birthDate.get(Calendar.YEAR);
		
        //如果还没有过生日,则 age - 1
		birthDate.add(Calendar.YEAR, age);
		if(today.before(birthDate)){
			age--;
		}
		System.out.println("age = " + age);
	}

   

}


判断是否为闰年:

package org.lokvin.example.calendar;

import java.util.GregorianCalendar;

/*
 * 判断是否为闰年 leap year
 */
public class CalendarExample5 {
	
	public static void main(String[] args) {
        //判断是否"闰年" leap year
		GregorianCalendar cal = new GregorianCalendar();
		boolean isLeapYear = cal.isLeapYear(1998);
		System.out.println("is leap year 1998 = " + isLeapYear);
		isLeapYear = cal.isLeapYear(2000);
		System.out.println("is leap year 2000 = " + isLeapYear);
	}
}

运行结果 :
引用

is leap year 1998 = false
is leap year 2000 = true


获得其他时区的时间:
package org.lokvin.example.calendar;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;

/*
 * 获得其他时区当前时间
 */

public class CalendarExample6 {
	
	public static void main(String[] args) {
		
		Calendar cal = new GregorianCalendar();
		int hour12 = cal.get(Calendar.HOUR);
		int hour24 = cal.get(Calendar.HOUR_OF_DAY);
		System.out.println("hour12 in our timezone = " + hour12);
		System.out.println("hour24 in our timezone = " + hour24);
		
		//获得其他时区的当前时间,根据 zoneId 获得时区
		Calendar calJap = new GregorianCalendar(TimeZone.getTimeZone("Japan"));
		hour12 = calJap.get(Calendar.HOUR);
		System.out.println("hour12 in japs timezone = " + hour12);
		hour24 = calJap.get(Calendar.HOUR_OF_DAY);
		System.out.println("hour24 in japs timezone = " + hour24);
		
        //获得 zoneId 的列表
		String[] zoneIds = TimeZone.getAvailableIDs();
		for(int i=0; i<zoneIds.length; i++) {
			String zoneId = zoneIds[i];
			System.out.println("zone id = " + zoneId);
		}
	}
}



运行结果:
引用

hour12 in our timezone = 5
hour24 in our timezone = 17
hour12 in japs timezone = 6
hour24 in japs timezone = 18
zone id = Etc/GMT+12
zone id = Etc/GMT+11
zone id = MIT
zone id = Pacific/Apia
zone id = Pacific/Midway
...


格式化日期:
package org.lokvin.example.calendar;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateForamExample {
	public static void main(String[] args) {
		Date rightNow = new Date();
		DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		DateFormat format2 = new SimpleDateFormat("yyyy-MM-dd");
		DateFormat format3 = new SimpleDateFormat("h:mm a");
		DateFormat format4 = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z");
		DateFormat format5 = new SimpleDateFormat("EEE, MMM, dd, ''yyyy");
		DateFormat format6 = new SimpleDateFormat("yyyy.MM.dd kk:mm 'o''clock' a, zzzz");
		DateFormat format7 = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");
		
		System.out.println("format1 = " + format1.format(rightNow));
		System.out.println("format2 = " + format2.format(rightNow));
		System.out.println("format3 = " + format3.format(rightNow));
		System.out.println("format4 = " + format4.format(rightNow));
		System.out.println("format5 = " + format5.format(rightNow));
		System.out.println("format6 = " + format6.format(rightNow));
		System.out.println("format7 = " + format7.format(rightNow));
	}

}

输出结果:
引用

format1 = 2006-12-05 06:12:02
format2 = 2006-12-05
format3 = 6:12 下午
format4 = 2006.12.05 公元 at 18:12:02 CST
format5 = 星期二, 十二月, 05, '2006
format6 = 2006.12.05 18:12 o'clock 下午, 中国标准时间
format7 = 02006.十二月.05 公元 06:12 下午

分享到:
评论
1 楼 bavnnsym 2010-03-09  
谢谢您!!!受用了

相关推荐

    java小记.rar

    Java Web开发是软件行业中一个广泛讨论的话题,涵盖了诸如Servlet、JSP、JDBC、MVC框架、企业级组件以及各种工具和技术。这份"java小记.rar"压缩包很可能包含了作者多年从事Java Web开发的经验总结,可能包括代码...

    Java transient关键字使用小记

    总之,`transient`关键字是Java中处理序列化时不可或缺的一部分,它允许开发者控制哪些对象属性在序列化过程中被忽略,从而保护敏感信息或者优化序列化过程。理解并正确使用`transient`关键字对于编写高效、安全的...

    华为ensp ar1启动失败 代码40 处理小记

    华为ensp ar1启动失败 代码40 处理小记,希望可以帮助到需要的人。

    linux+java+python3+numpy+stl的3d打印小记

    通过Python和NumPy,你可以解析这些面片,进行布尔运算,甚至自定义算法优化模型结构,减少打印时间和材料消耗。 此外,Python还有其他库如Trimesh、OpenSCAD等,它们可以进一步处理STL文件,进行模型修复、检查...

    android开发小记

    在“android开发小记”这个主题中,我们可以深入探讨Android应用程序开发的相关知识,特别是通过查看提供的压缩文件中的代码示例。这些文件名如lesson_8_code.zip至lesson_20_codel.zip,以及不同的Mp3Player版本,...

    C++写的家庭小记账本

    7. **日期与时间处理**:记账通常涉及到日期和时间,C++标准库中的chrono头文件可以用来处理日期和时间,方便记录交易的发生时间。 8. **报表生成与统计分析**:为了便于用户分析消费习惯,软件可能提供生成报表的...

    每日小记,记录账单和日记

    在IT行业中,应用程序的开发和设计是至关重要的,特别是那些能帮助用户管理和组织日常生活的工具。"每日小记"就是这样一款应用,它结合了记账和日记的功能,为用户提供了一个全面的生活记录平台。 首先,我们要了解...

    Hessian 的字段序列化小记

    - "common-interface"可能是一个包含公共接口的模块,这些接口定义了Hessian服务之间交互的数据结构和方法签名,确保客户端和服务端能正确解析和处理序列化后的数据。 - "hessian-client"和"hessian-server"则分别...

    xstream使用小记

    总结来说,Xstream是Java开发者处理XML数据的强大工具,它简化了对象与XML之间的转换过程,同时也提供了扩展性和灵活性。无论是在测试、配置文件还是持久化存储中,Xstream都展现出了其高效和便捷的特性。通过深入...

    php&amp;mysql 日期操作小记

    3. **日期时间操作**:MySQL提供了多种日期和时间函数,如`DAYOFWEEK()`, `DAYOFMONTH()`, `DAYOFYEAR()`等,可以获取日期在一周、一月、一年中的位置。此外,还有`DATE_ADD()`和`DATE_SUB()`用于增加或减少日期,如...

    spring 小记

    Spring框架是Java开发领域中的一款重量级开源框架,以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)为核心,极大地简化了企业级应用的开发工作。这篇小记将深入探讨...

    图片缩放 小记

    通常,这涉及到图像处理库的使用,如在Python中的PIL(Pillow)库或Java中的Java AWT/Swing库。 图片缩放的过程可以分为两种基本类型:按比例缩放和固定尺寸裁剪。按比例缩放会保持原始图像的宽高比,防止图像变形...

    android应用登录模块访问mysql数据库小记.pdf

    1. 加载MySQL驱动:在Java中,使用`Class.forName()`方法加载数据库驱动,如`org.gjt.mm.mysql.Driver`或`com.mysql.jdbc.Driver`。这两个驱动都可用于连接MySQL,只是不同的库版本,实际效果是一样的。 2. 数据库...

    阿里大数据分析平台使用小记

    阿里大数据分析平台使用小记 阿里大数据分析平台是阿里巴巴集团旗下的数据分析平台,提供了大数据处理、存储和分析的能力。该平台主要应用于天池大数据竞赛平台,提供了一些使用经验和教程,但不是完整的开发使用...

    Flex整合J2EE开发小记+源码下载

    【标题】"Flex整合J2EE开发小记+源码下载"揭示了本文将探讨如何在Java企业级环境中(J2EE)集成Adobe Flex技术,用于构建富互联网应用程序(RIA)。Flex是一种强大的客户端开发框架,它允许开发人员创建交互性强、...

Global site tag (gtag.js) - Google Analytics