彻底搞明白Calendar中的一些易混淆的属性和方法

来源:互联网 发布:pyqt4 linux安装 编辑:程序博客网 时间:2024/05/17 23:18
属性名称:Calendar.DATE

代表含义:一个月中的第几天,同Calendar.DAY_OF_MONTH


属性名称:Calendar.DAY_OF_MONTH
代表含义:一个月中的第几天,同Calendar.DATE


属性名称: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


属性名称:Calendar.DAY_OF_WEEK_IN_MONTH
代表含义:这一天所对应的星期几在该月中是第几次出现

属性名称:Calendar.DAY_OF_YEAR
代表含义:一年中的第几天


属性名称:Calendar.HOUR
代表含义:12小时制下的小时数,中午和午夜表示为0


属性名称:Calendar.HOUR_OF_DAY
代表含义:24小时制下的小时数,午夜表示为0


属性名称:Calendar.MILLISECOND
代表含义:毫秒数


属性名称:Calendar.MINUTE
代表含义:分钟

属性名称:Calendar.SECOND
代表含义:秒

属性名称:Calendar.WEEK_OF_MONTH
代表含义:一个月中的第几个星期


属性名称:Calendar.WEEK_OF_YEAR
代表含义:一年中的第几个星期


属性名称:Calendar.YEAR
代表含义:年份


在项目会遇到这么一个问题假设执行了这么一段代码

public static void main(String[] args) {// TODO Auto-generated method stub        Calendar calendar = Calendar.getInstance();        calendar.set(Calendar.YEAR,2016);        calendar.set(Calendar.MONTH,0);        calendar.set(Calendar.DAY_OF_MONTH,31);        calendar.set(Calendar.HOUR_OF_DAY,12);//Calendar.HOUR_OF_DAY是24小时制        calendar.set(Calendar.MINUTE,11);        calendar.set(Calendar.SECOND,0);        calendar.set(Calendar.MILLISECOND,0);        System.out.println("之前的数据");        System.out.print(" 年:" + calendar.get(Calendar.YEAR));        System.out.print(" 月:" + calendar.get(Calendar.MONTH));        System.out.print(" 日:" + calendar.get(Calendar.DAY_OF_MONTH));        System.out.print(" 时:" + calendar.get(Calendar.HOUR_OF_DAY));        System.out.println(" 分:" + calendar.get(Calendar.MINUTE));        calendar.add(Calendar.DAY_OF_MONTH,1);        System.out.println("之后的数据");        System.out.print(" 年:" + calendar.get(Calendar.YEAR));        System.out.print(" 月:" + calendar.get(Calendar.MONTH));        System.out.print(" 日:" + calendar.get(Calendar.DAY_OF_MONTH));        System.out.print(" 时:" + calendar.get(Calendar.HOUR_OF_DAY));        System.out.print(" 分:" + calendar.get(Calendar.MINUTE));}

此处注意Android当中的月份是从0开始的,切记!切记!切记!,老是忘掉,所以刚开始的将0赋值给Calendar.MONTH,就是一月份了也就是2016/01/31,

再执行一个add方法 calendar.add(Calendar.DAY_OF_MONTH,1);功能就是在原来基础上往后推迟一天,注意再加一天的话理论应该变为2月1号

输出结果

之前的数据 年:2016 月:0 日:31 时:12 分:11之后的数据 年:2016 月:1 日:1 时:12 分:11

最后验证了自己的结论是正确的,这种结果对于在开发中周期性闹铃提醒非常有用,因为有时候你不知道这个月有多少天,自动加1的话,如果是这个月的最后一天那么就会直接进入下一个月,项目开发中深有体会!


再看下面一个例子

        Calendar calendar = Calendar.getInstance();         calendar.clear();         calendar.set(1970, 0, 1);         System.out.println(calendar.getTime());         System.out.println(calendar.getTimeInMillis());

输出

Thu Jan 01 00:00:00 CST 1970-28800000
这是为什么呢?是因为我们身处东八区相差八个小时


如果这样输入:

        Calendar calendar = Calendar.getInstance(); //        calendar.clear(); //        calendar.set(1970, 0, 1); //        System.out.println(calendar.getTime()); //        System.out.println(calendar.getTimeInMillis());                calendar.clear();         calendar.set(1970, 0, 1);         TimeZone tz = TimeZone.getTimeZone("GMT");                calendar.setTimeZone(tz);         System.out.println(calendar.getTime());         System.out.println(calendar.getTimeInMillis()); 

输出:

Thu Jan 01 08:00:00 CST 19700
Calendar calendar1 = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));Calendar calendar2 = Calendar.getInstance(TimeZone.getTimeZone("GMT+1"));System.out.println("Millis = " + calendar1.getTimeInMillis());System.out.println("Millis = " + calendar2.getTimeInMillis());System.out.println("hour = " + calendar1.get(Calendar.HOUR));System.out.println("hour = " + calendar2.get(Calendar.HOUR));System.out.println("date = " + calendar1.getTime());System.out.println("date = " + calendar2.getTime());

首先,java.util.Date代表一个时间点,其值为距公元1970年1月1日 00:00:00的毫秒数。所以它是没有时区和Locale概念的。java通过如下形式取得当前时间点:

Date now = new Date();  //这个时间点与本地系统的时区无关

而正因为其与时区的无关性,才使得我们的存储数据(时间)是一致的(时区一致性)。一般的我们将now存储于数据库中,当我们需要展现数据时,将 now格式化成想要的格式,如:2011-11-19 14:12:23。而这个功能一般交由java.text.DateFormat来实现。例如:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String snow = sdf.format(now);  // 2011-11-19 14:12:23
 
我们发现snow是带时间(14:12:23)的字符串,我们不禁要问,该时间(14:12:23)是哪个时区的时间?默认情况 下,SimpleDateFormat 取得本地系统的时区(我的时区为GMT+8北京),然后按照pattern("yyyy-MM-dd HH:mm:ss")格式化now,此时输出的就是GMT+8区的时间了。如果想支持国际化时间,则先指定时区,然后再格式化date数据。例如:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
String snow = sdf.format(now);  // 2011-11-19 14:12:23
另外,你可以通过如下代码修改本地时区信息:
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
 
java.util.Calendar类也代表时间点,但它为Date的facade工具类,提供了很多对时间点到年、月、日、时、分、秒、星期等的转换(计算)的方便方法。
Calendar calendar = Calendar.getInstance(timezone); 
Date d = calendar.getTime();
Calendar 的计算也是基于时区的,例如:同一个date在不同时区下的小时数是不一样的。但是calendar.getTime();返回的date是没有时区的,因为它是Date类型的。如上例:




0 0