彻底搞明白Calendar中的一些易混淆的属性和方法
来源:互联网 发布:pyqt4 linux安装 编辑:程序博客网 时间:2024/05/17 23:18
代表含义:一个月中的第几天,同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类型的。如上例:
- 彻底搞明白Calendar中的一些易混淆的属性和方法
- fcntl和select函数彻底搞明白
- fcntl和select函数彻底搞明白
- 彻底搞明白傅里叶变换的意义
- 彻底搞明白layout_weight
- 一些没搞明白或者容易混淆的概念以及面试中可能遇到的问题
- 做个实验彻底搞明白Java中的值传递和引用传递
- Calendar中的一些方法
- Calendar中的一些方法
- Calendar中的一些方法
- 彻底搞明白java synchronized
- C#中一些没搞明白或者容易混淆的概念以及面试中可能遇到的问题
- 彻底搞明白find命令的-mtime参数的含义
- javascript的【原型】【prototype】理解-【浅显易懂】【彻底搞明白】
- 搞明白gluPerspective和gluLookAt的关系
- 彻底明白Hibernate中的Inverse的含义
- 彻底搞明白 Google Analytics Cookie
- 彻底搞明白:CSS3圆角使用
- UITextFiled的输入框改成一条下划线
- Axure VS Mockplus VS Balsamiq - 原型图设计工具对比
- Missing Ranges
- iOS二级tabView,左右两个tableView,点左边,刷新右边
- hdoj 3974 Assign the task 【DFS + 线段树区间修改】
- 彻底搞明白Calendar中的一些易混淆的属性和方法
- iOS常用第三方框架/库
- VC Web打印解决方案概述
- Windows 7中的“帮助和支持”无法打开怎么办?
- Debug your Java code with ease using JPDA
- Android_编程开发规范
- 20160108HTML学习笔记html的四大基本结构
- C#实现SFTP文件传输
- 使用std::string 通过dll接口传递时,应该注意的问题