[Java基础教程]第九章-Java日期处理
中国古代是否有自己的历法是朝代是否确立的标志之一,可见日期时间对人们生活的重要性,在计算机中日期和时间仍然占有非常重要的地位。Java中日期是以1970-01-01 08::00:00为基准,其他时间为这个基准的相加(或者相减)的毫秒数。获取当前时间的毫秒数,可以使用“System.currentTimeMillis()"。为了方便使用JDK提供了一个日期时间类java.lang.Date,直接new Date(),也可以获取当前时间。
System.out.println(System.currentTimeMillis()); System.out.println(newDate().getTime());
上面的代码执行时可能存在下面的输出比上面的输出大,是因为执行时时间已经变更,Date的getTime()方法会返回该时间的long型表示的值,如果不调用这个方法,会输出为"Mon Feb 01 22:34:06 CST 2016"(这个是当前时间的值)的格式。任何类都会继承Object方法,其中会实现toString(),方法,对象直接打印时会调用toString()方法,这点后面我们会有一章主讲这块,这里先了解一下,Date的toString就是把时间输出为这种格式。这种方式可能美国人更熟悉,对于中国人不太直观,那么怎么输出我们熟悉的格式呢?
jdk为格式化Date提供了一个工具类java.text.DateFormat,这是一个抽象类,最常用的子类为java.text.SimpleDateFormat,我们把当前时间输出为"2016-02-01 23:27:72"的格式,代码如下:
DateFormat dateFormat = newSimpleDateFormat("yyyy-MM-dd HH:mm:SS"); Date curDate = newDate(); System.out.println(dateFormat.format(curDate));
jdk的把年月日以及各种时间输出的方式使用字母表示具体的格式,比如年使用"yyyy",月使用"MM",具体的对应关系如下表:
字母 日期或时间元素 表示 示例
字母 | 日期或时间元素 | 表示 | 示例 |
---|---|---|---|
G | Era 标志符 | Text | AD |
y | 年 | Year | 1996 ; 96 |
M | 年中的月份 | Month | July ; Jul ; 07 |
w | 年中的周数 | Number | 27 |
W | 月份中的周数 | Number | 2 |
D | 年中的天数 | Number | 189 |
d | 月份中的天数 | Number | 10 |
F | 月份中的星期 | Number | 2 |
E | 星期中的天数 | Text | Tuesday ; Tue |
a | Am/pm 标记 | Text | PM |
H | 一天中的小时数(0-23) | Number | 0 |
k | 一天中的小时数(1-24) | Number | 24 |
K | am/pm 中的小时数(0-11) | Number | 0 |
h | am/pm 中的小时数(1-12) | Number | 12 |
m | 小时中的分钟数 | Number | 30 |
s | 分钟中的秒数 | Number | 55 |
S | 毫秒数 | Number | 978 |
z | 时区 | General time zone | Pacific Standard Time ; PST ; GMT-08:00 |
Z | 时区 | RFC 822 time zone | -0800 |
Date类也存在接收入参的构造方法,比如"Date curDate2 = new Date(System.currentTimeMillis());"同样可以获取当前时间,前面我们提到时间是以1970-01-01 08::00:00为基准的long型存储的,我们在初始化Date时,传入0值,看下会输出的是不是"1970-01-01 08::00:00",代码如下:
Date date1970 = newDate(0); System.out.println(dateFormat.format(date1970));
工作中,日期的变化改变也是一个比较常用的功能。比如今天是2016-02-01是一个纪念日,那么2017-02-01我需要收到一个提醒,所以我们需要把时间调整为2017年的此刻,然后再进行一些其他的操作。我们可以采用字符串转换为日期的方式,比如:
Date date2017 = dateFormat.parse("2017-02-01 23:27:72"); System.out.println(date2017);
这种方式要求我们必须确定的日期才能处理,使用起来不太方便,为了更方便处理时间变更,jdk提供了更优雅的方式Calendar日历。
Calendar calendar = Calendar.getInstance(); calendar.setTime(curDate2); intcurYear = calendar.get(Calendar.YEAR); calendar.set(Calendar.YEAR, curYear + 1); System.out.println(dateFormat.format(calendar.getTime()));
setTime为Calendar对象设置一个时间,get(int)获取int表示的值, set(int, int)设置第一个入参表示的类型的值为第二个入参,比如"calendar.set(Calendar.YEAR, curYear + 1)"设置calendar的年为当前时间的年+1, getTime获取时间。get和set可以处理的类型在Calendar有常量定义,大家可以在Calendar的源码中查看。
小练习:
打印出从1000年到2000年中哪些是闰年。
packagecom.sunhaojie.learntest.ninth; importjava.text.DateFormat; importjava.text.ParseException; importjava.text.SimpleDateFormat; importjava.util.Calendar; importjava.util.Date; /** * * @ClassName DateTest * @Description 日期测试类 * * @author sunhaojie 3113751575@qq.com * @date 2016年2月1日 下午11:24:31 */ publicclassDateTest { /** * * @Title main * @Description 日期测试 * @param args * @return void * * @author sunhaojie 3113751575@qq.com * @throws ParseException * @date 2016年2月1日 下午10:19:27 */ publicstaticvoidmain(String[] args) throwsParseException { System.out.println(System.currentTimeMillis()); System.out.println(newDate().getTime()); System.out.println(newDate()); DateFormat dateFormat = newSimpleDateFormat("yyyy-MM-dd HH:mm:SS"); Date curDate = newDate(); System.out.println(dateFormat.format(curDate)); Date curDate2 = newDate(System.currentTimeMillis()); System.out.println(dateFormat.format(curDate2)); Date date1970 = newDate(0); System.out.println(dateFormat.format(date1970)); Date date2017 = dateFormat.parse("2017-02-01 23:27:72"); System.out.println(date2017); Calendar calendar = Calendar.getInstance(); calendar.setTime(curDate2); intcurYear = calendar.get(Calendar.YEAR); calendar.set(Calendar.YEAR, curYear + 1); System.out.println(dateFormat.format(calendar.getTime())); } }
建议继续学习:
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:sunhaojie 来源: 孙豪杰的博客
- 标签: 日期
- 发布时间:2016-02-21 22:40:23
- [52] IOS安全–浅谈关于IOS加固的几种方法
- [52] 图书馆的世界纪录
- [51] 如何拿下简短的域名
- [50] android 开发入门
- [49] Go Reflect 性能
- [49] Oracle MTS模式下 进程地址与会话信
- [47] 【社会化设计】自我(self)部分――欢迎区
- [45] 读书笔记-壹百度:百度十年千倍的29条法则
- [37] 程序员技术练级攻略
- [28] 视觉调整-设计师 vs. 逻辑