java.util.Date Calendar

Date

静态方法System.currentTimeMillis() 返回从1970年1月1日到现在的总毫秒数。返回类型为long。下面是一个例子:

long timeNow = System.currentTimeMillis();

 


实际上要做的就只有这么多了。返回long类型的值可以用于初始化java.util.Date,java.sql.Date、java.sql.Timestamp和java.util.GregorianCalendar对象。

unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒

由于java.util.Date类实现了java.lang.Comparable接口,所以你可以对java.util.Date实例进行比较。下面将介绍如何使用:

java.util.Date date1 = new java.util.Date();
java.util.Date date2 = new java.util.Date();
 
int comparison = date1.compareTo(date2);
 

变量comparison遵循着Comparable接口的规则,意味着compareTo()方法将返回:

public int compareTo(Date anotherDate) {
        long thisTime = getMillisOf(this);
        long anotherTime = getMillisOf(anotherDate);
        return (thisTime<anotherTime ? -1 : (thisTime==anotherTime ? 0 : 1));
    }
  • 一个int类型的大于0的值,如果某个date(该datecompareTo()方法被调用)晚于作为compareTo()方法参数的date
  • 一个int类型的等于0的值,如果某个date(该date的compareTo()方法被调用)等于作为compareTo()方法参数的date
  • 一个int类型的小于0的值,如果某个date(该date的compareTo()方法被调用)早于作为compareTo()方法参数的date

获取年、月、日、小时等的方法已经不推荐使用,显然内部的计算方法不完全正确。(原文:Apparently the algorithms used internally were not entirely correct.)
如果你需要获取或者设置年、月、日、小时等,则使用java.util.Calendar

(译者注
关于java.util.Date类中的大部分方法已经不推荐使用的原因,摘录Oracle设计新的Date Time API的目的如下(地址在这):

新的API是由三个核心理念驱动的:
1、不可变类。在现有的Java格式化器有一个致命的缺陷,那就是他们不是线程安全的。这给开发者带来了负担,开发者得以线程安全的方式使用它们,并且在每天的开发中去思考时间处理代码的并发问题。新的API通过确保它的核心类是不可变的且表示定义明确的值来避免这个问题。
2、领域驱动设计。新的API模型的领域是非常精确的,这些类为date和time描绘了不同的使用情况。(原文:The new API models its domain very precisely with classes that represent different use cases for Date and Time closely.)这区别于之前的Java类库对这方面糟糕的考虑。举个例子,java.util.Date代表时间线上的一个瞬间(包含了从Unix新纪元到现在的总毫秒数),但是如果调用了DatetoString(),返回值会提示它是带着时区的,这会让开发者感到疑惑。
领域驱动设计的重点在于在清晰度和可理解度中提供了长期的好处,但当你要从之前的API移植到Java SE 8时,可能需要对你应用中的领域模型思考清楚。
3、年代表的分离。为了支持这世界上某些地区的使用者的需要(比如日本、泰国,不需要遵循国际标准ISO-8601),新的API允许人们使用不同的日历系统。而这是在不需要给大部分只使用标准年代表的开发者强加额外的负担的情况下做到的。)

 

Calendar

Calendar是一个抽象类,我们无法直接实例化它,它有一个具体子类实体类java.util.GregorianCalendar,这个类实现的就 是我们日常所用的公历历法,或者叫做阳历。我们可以直接使用new命令创建它的实例,或者使用Calendar类的getInstance方法来获得它实 例.
Calendar c1 = Calendar.getInstance();  
Calendar c2 = new GregorianCalendar();  
// 参数含义依次为:年、月、日(、时、分、秒 ),
Calendar c3 = new GregorianCalendar(2008, 8, 8, 18, 10, 5);  

有两个地方需要注意:

JAVA表示的月份是从0开始的,也就是说它用来表示月份的数值总是比实际月份值小1。因此我们要表示8月份,就是应该设置8-1=7这个值。
GregorianCalendar的小时数是24小时制的。
为了避免出现因为忘记处理1的差值而设置了错误的月份,也让代码看起来更加直观,推荐大家使用定义在Calendar类的的这些常量来代替直接用数字表示月份:
一月:Calendar.JANUARY = 0
二月:Calendar.FEBRUARY = 1
三月:Calendar.MARCH = 2
四月:Calendar.APRIL = 3
五月:Calendar.MAY = 4
六月:Calendar.JUNE = 5
七月:Calendar.JULY = 6
八月:Calendar.AUGUST = 7
九月:Calendar.SEPTEMBER = 8
十月:Calendar.OCTOBER = 9
十一月:Calendar.NOVEMBER = 10
十二月:Calendar.DECEMBER = 11
如果我们想要从Calendar对象获得各种属性的值,就需要调用它的get(int field)方法,这个方法接收一个int型的参数,并且根据这个给定参数的值来返回相应的属性的值。

当前时刻:2008年07月22日 13:16:07.421
属性名称:Calendar.AM_PM
代表含义:上下午标识,上午返回Calendar.AM=0,下午返回Calendar.PM=1
测试结果:1
属性名称:Calendar.DATE
代表含义:一个月中的第几天,同Calendar.DAY_OF_MONTH
测试结果:22
属性名称:Calendar.DAY_OF_MONTH
代表含义:一个月中的第几天,同Calendar.DATE
测试结果:22
属性名称:Calendar.DAY_OF_WEEK
代表含义:一周中的第几天,对应星期几,第一天为星期日,于此类推。
星期日:Calendar.SUNDAY=1
星期一:Calendar.MONDAY=2
星期二:Calendar.TUESDAY=3
星期三:Calendar.WEDNESDAY=4
星期四:Calendar.THURSDAY=5
星期五:Calendar.FRIDAY=6
星期六:Calendar.SATURDAY=7
测试结果:3
属性名称:Calendar.DAY_OF_WEEK_IN_MONTH
代表含义:这一天所对应的星期几在该月中是第几次出现
测试结果:4
属性名称:Calendar.DAY_OF_YEAR
代表含义:一年中的第几天
测试结果:204
属性名称:Calendar.HOUR
代表含义:12小时制下的小时数,中午和午夜表示为0
测试结果:1
属性名称:Calendar.HOUR_OF_DAY
代表含义:24小时制下的小时数,午夜表示为0
测试结果:13
属性名称:Calendar.MILLISECOND
代表含义:毫秒数
测试结果:421
属性名称:Calendar.MINUTE
代表含义:分钟
测试结果:16
属性名称:Calendar.MONTH
代表含义:月份,从0到11表示12个月份,比实际月份值小1
测试结果:6
属性名称:Calendar.SECOND
代表含义:秒
测试结果:7
属性名称:Calendar.WEEK_OF_MONTH
代表含义:一个月中的第几个星期
测试结果:4
属性名称:Calendar.WEEK_OF_YEAR
代表含义:一年中的第几个星期
测试结果:30
属性名称:Calendar.YEAR
代表含义:年份
测试结果:2008

 

posted @ 2016-07-18 11:05  He_quotes  阅读(101)  评论(0)    收藏  举报