转载:http://blog.youkuaiyun.com/pnet2008/article/details/17021579
放在一起做个介绍,让大家能对这些日期和时间处理类有个全面的了解。
Java中包含了以下的日期和时间的处理类或方法
System类的一个静态方法,返回从1970年1月1日到现在的毫秒数。 | |
一个日期和时间的表示类,不过它里面的好多方法都是不推荐使用的。 | |
一个被JDBC使用的日期类,里面好多方法也是不推荐使用的 | |
一个被JDBC使用的时间类,里面好多方法也是不推荐使用的 | |
一个被JDBC使用的时间戳类 | |
一个基本的日历类,这个类提供了一些方法可以在一个日期上对年月日等做运算来得到另一个日期。 | |
java.util.Calendar类的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。 | |
一个时区表示类,在跨时区表示日历时比较有用。 | |
一个日期转换类,提供日期类型和字符串之间的互相转换。 |
那么我们该使用哪个类呢?这取决于你的程序要完成的任务,在接下来的小节中我会对这些类做详细介绍。
一、
System.currentTimeMillis()
静态方法System.currentTimeMillis()返回1970-01-01 00:00:00.000到现在的毫秒数,返回值是一个long型
返回值可以用来初始化java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp,例如:
System.nanoTime()
顺便说一下System.nanoTime(),这也是一个静态方法,获得一个以纳秒为单位的值。但是它和日期或时间的表示没有任何关系,不要将它和当前的日期或时间联系起来。在上面我们看到System.currentTimeMillis()返回的是1970-01-01 00:00:00.000到现在的毫秒数,但System.nanoTime()返回的不是1970-01-01 00:00:00.000到现在的纳秒数,这个计时开始时间是不确定的。
System.nanoTime()虽然和当前时间没关系,但是API文档中推荐用它可以来衡量程序的运行时间
以上这段程序在大多数情况下可以得到我们期望的结果,但也有例外,例如在window xp系统中可能会出现负值。
至于为什么出现负值,网上有资料说和CPU和操作系统都有关系,由于本人理解也很局限,不妄下定论,有兴趣的同学可以研究一下。
二、
Java.util.Date的创建
java.util.Date这个类可能是我们最常用的一个用来表示日期的类了。我们可以像下面这样初始化一个实例来表示当前日期和时间:
Date类中有一个getTime()方法可以用来获取日期实例的毫秒表示
这个time的值和在创建date实例的时刻调用System.currentTimeMillis()获取到的值是一样的。
所以,你也可以像下面这样创建一个日期实例:
java.util.Date之间的比较
由于java.util.Date实现了java.lang.Comparable接口,所以我们可以像下面那样使用compareTo()方法来比较两个实例的值:
如果date1小于date2返回-1
如果date1和date2相等返回0
如果date1大于date2返回1
除了使用compareTo()方法,还可以使用Date类另外提供的before()和after()方法来进行比较
注意,不管是使用compareTo()还是使用before()和after()来进行比较,这个比较的精度都是只精确到毫秒。
写在结尾
java.util.Date关于年月日等get和set操作都已经是不推荐的方法了,如果需要对这些值进行操作,那我们该考虑使用java.util.Calendar类来代替java.util.Date类。
三、ava.util.Calendar是一个抽象类,它定义了日历相关的一系列操作,使用java.util.Calendar除了可以表示日期和时间,还可以用它来对时期或时间进行算术运算,比如获取当前日期10天之后的日期。
Java.util.Calendar由于是一个抽象类,所以我们不能对它进行实例化,如果想获得一个日历实例,可能要用到java.util.GregorianCalendar类。
实例化
java.util.GregorianCalendar是java.util.Calendar的一个实现类,当然除了java.util.GregorianCalendar还有其它实现类,这里不做讨论。
可以像下面这样获得一个日历实例:
calendar1和calendar2都是代表了一个以当前日期和时间为基础的日历对象。
获取日期和时间
Calendar类提供了一系列方法可以用来获取年、月、日、时、分、秒、毫秒、时区等,像下面这样:
当然不止这些,还有其它的,可以参看JavaDoc文档。
设置日期和时间
calendar除了提供了get方法来获取日期或时间,也提供了许多set方法用来设置日历实例的日期或时间:
关于日历的算术运算
使用Calendar的add()方法可以对日历实例进行计算,比如:
如果做减法,可以给add()传递一个负值来达到目的:
需要注意的地方
2、calendar类中使用1到7来表示周日到周六,1表示周日,7表示周六,比如calendar.get(Calendar.DAY_OF_WEEK)的值是3,那么表示周二。
四、
Java.text.SimpleDateFormat类我们一般用来它实现字符串于java.util.Date之间的互转,比如将Date实例转换为指定的字符串表示形式,
或者将一个字符串的日期表示转为具体的Date实例。
创建SimpleDateFormat实例
可以像下面一样创建一个SimpleDateFormat实例:
其中pattern参数用来指定字符串和日期互转时的格式。
日期转换成字符串
使用format()方法可以将一个日期类型的值转换为字符串表示形式,比如:
注意,format()方法的参数必须是java.util.Date类型的实例。
字符串转换为日期
使用parse()方法可以可以将一个日期形式的字符串转换为一个java.util.Date类型:
根据具体的语言环境创建SimpleDateFormat实例
具体的语言环境可以通过Locale类表示,在这先不做介绍了。想通过具体语言环境来创建SimpleDateFormat实例可以像下面那样:
输出如下:
我们发现星期和月份的表示都是中文的,如果new Locale("zh", "ZH")换成new Locale("en", "EN"),那输出就会变为:Wednesday December 2013 17:09:04.757+0800
常用日期格式