一、获取当前时间
在Java中获取当前时间我一般总是使用long java.lang.System.currentTimeMillis()
方法,Long类型是基本类型,运算(如比较时间的前后)、传输和存储都很方便。
当然,如果有的方法要使用java.util.Date类型,可能通过构造函数new Date(long date)来切换类型。java.util.Date.getTime()方法,则把Date类型切换成Long类型。当然使用Date的缺省构造函数new Date()来获得当前的时间的Date。
查看国际站的代码你会看到不少代码使用了java.util.Calendar.getInstance()方法。再通过java.util.Calendar.getTime()来获取Date,或是通过java.util.Calendar.getTimeInMillis()来获取Long。
或是Google一下“Java获取当前时间”,会看到很多人也是推荐使用Calendar,说Date很多方法已经@Deprecated。
我个人不赞同这一点,原因如下:
- 简单方法能解决问题。Calendar显然概念上复杂很多,另两种用法用意也是非常的清晰。
- 性能问题。看下面运行数据。 (不要一开始就考虑性能问题,性能问题往往不会成为问题;性能问题往往也是由上一点复杂性引起的) 三个方法运行10M次所用时间:(在我开发机上的运行时间,只是示意一下比例)
# java.util.Calendar.getInstance()方法消耗时间 约是 new Date() 的 20倍。
二、时间的处理
上面说了获取当前时间不要用Calendar类,那什么时候使用Calendar类呢?
Long类型,表示了时间的值;Date类型,提供了几个获取年月日的方法、字符串,还有对象的标准方法()。
时间的操作:
- 比较时间前后、计算两个时间差值。
- 计算出时间对应的的年月日、所在的周数,等等。
这些计算涉及其它的信息:所在时区(不同时区几点是不一样的),本地化信息(输出成中文的星期一、还是英文的Monday)
做这些计算正是实现复杂的Calendar类要解决的问题。 - 常用的时间日期打印操作,比如“2012年3月4日 15:16:17”,显然有年月日的计算,涉及了时区、本地化。
- 记录、存储、传输时间,使用long类型(只需4字节存储空间)、Date类型。时间计算、显示时间使用Calendar类提供的方便方法。
FEATURED TAGS
生活
blog
Java
shell
Unix/Linux
unix
Groovy
jms
mom
middleware
extension
log4j
philosophy
原则
最佳实践
Shell
generic
gnu
windows
cmd
tips
dubbo
Service
设计
class
date
i/o
api
design
服务
优劣
Linux
git
week
日期
星期
计算
月份
命令行
配置
Windows
Dubbo
约定
权限
Command Line
发布
java
cooma
release
微容器
github
microcontainer
扩展点
容器