Java开发笔记(三十九)日期工具Date
Date是Java最早的日期工具,编程中经常通过它来获取系统的当前时间。当然使用Date也很简单,只要一个new关键字就能创建日期实例,就像以下代码示范的那样:
// 创建一个新的日期实例,默认保存的是系统时间
Date date = new Date();
有了这个日期实例,再来调用getYear(获取年份)、getMonth(获取月份)、getDate(获取日子)、getDay(获取星期几)、getHours(获取时钟)、getMinutes(获取分钟)、getSeconds(获取秒钟)等方法,即可获得相应的时间单位数值。然而由于Date早在Java诞生之初就一同问世,实际用的时候并不利索,往往需要程序员进行二次加工,才能得到符合现实生活的时间数值。下面列举几个额外处理的例子,说明Date工具有哪些地方需要特别注意:
1、关于如何获取日期实例中的年份
调用日期实例的getYear方法,结果得到的年份数值并非公元纪年,而是从1900年开始计数的年份。因此getYear方法返回的结果还要加上1900,二者相加之和才是真正的公元年份,于是通过Date获取正常年份的代码应该改成下面这样:
// 获取日期实例中的年份
int year = date.getYear() + 1900;
System.out.println("year="+year);
2、关于如何获取日期实例中的月份
虽然getMonth方法获得的是两位月份,但是该方法的月份居然是0开始计数的!也就是说,如果当前日期位于一月份,那么getMonth返回的数值为0而不为1;依此类推,如果当前日期位于十二月份,则getMonth返回的数值为11。很明显早期的Java设计人员把十二个月当作一个整型数组了,既然一月份处于该数组的第一个位置,那么它对应的下标就是0。如此一来,若要得到现实生活中的月份序号,必须给getMonth的结果加一才行,修改后的代码如下所示:
// 获取日期实例中的月份
int month = date.getMonth() + 1;
System.out.println("month="+month);
3、关于如何获取日期实例中的星期几
按照大众的普遍认知,一个星期中的七天,理应从星期一开头,以星期日结尾。可是日期实例的getDay方法却从星期日开始,接下来才是星期一、星期二等等;并且这七个星期数值依然被当作一个整型的星期数组,所以对于星期日来说,getDay返回的是0,对于星期一来说,getDay返回的是1。故而也有必要修正getDay的结果,将星期日对应的数值改为7,处理之后的获取代码示例如下:
// 获取日期实例中的星期几
int dayWeek = date.getDay();
dayWeek = (dayWeek==0) ? 7 : dayWeek; // 将星期日对应的数值改为7
System.out.println("dayWeek="+dayWeek);
经过以上的数番折腾,真教人倒吸一口冷气,原本是小学生都知道的常识,未曾想被Date这个日期工具搞得如此诘屈聱牙,可见即便是设计一种编程语言,也得调研一下大众的寻常认知,切不可闭门造车使人徒增烦恼。幸好通过Date获取其余的时间单位比较常规,像getDate方法返回的就是当月的日子,getHours、getMinutes、getSeconds这三个方法分别返回当前的时钟、分钟、秒钟,这些时间数值的获取代码如下所示:
// 获取日期实例中的日子
int dateInt = date.getDate();
System.out.println("dateInt="+dateInt);
// 获取日期实例中的时钟
int hour = date.getHours();
System.out.println("hour="+hour);
// 获取日期实例中的分钟
int minute = date.getMinutes();
System.out.println("minute="+minute);
// 获取日期实例中的秒钟
int second = date.getSeconds();
System.out.println("second="+second);
// 获取日期实例中的时间总数(单位毫秒)
long time = date.getTime();
System.out.println("time="+time);
除了上述的一系列get***方法可用来获取各种时间单位数值,Date工具还提供了相对应的set***方法,用于设置日期实例的某个时间数值。下面是设置时间单位数值的相关方法说明:
setYear:设置日期实例中的年份。
setMonth:设置日期实例中的月份。
setDate:设置日期实例中的日子。
setHours:设置日期实例中的时钟。
setMinutes:设置日期实例中的分钟。
setSeconds:设置日期实例中的秒钟。
setTime:设置日期实例中的时间总数(单位毫秒)。
时间看似复杂,其实它是一种特殊的数字,只不过被人为换算成年月日、时分秒的各种单位组合。既然数字有大小之分,时间也存在先后顺序,当然我们不说哪个时间较大、哪个时间较小,而说哪个时间较早、哪个时间较晚。犹记得数值包装类型提供了equals方法比较两个数字是否相等,Date类型同样提供了equals方法比较两个时间是否相等。与时间相等比起来,大家更关心两个时间的早晚先后关系,所以Date类型又提供了before方法,用来检查A时间是否在B时间之前;也提供了after方法,用来检查A时间是否在B时间之后。如此一来,便有了三种时间校验方法:相等、更早和更晚,显然这三个方法都是检查两个时间的先后关系,不妨将它们统一起来,通过方法的返回值来判断两个时间的早晚次序。于是就有了Date类型的compareTo方法,该方法返回-1的时候,表示A时间较早;返回0的时候,表示两个时间相等;返回1的时候,表示B时间较早。最后给出上述时间判断的演示代码:
// 比较两个日期时间的先后关系
private static void compareDate() {
Date dateOld = new Date();
Date dateNew = new Date();
// 设置dateNew的时间总数(单位毫秒)。此处表示给当前时间增加一毫秒
dateNew.setTime(dateNew.getTime()+1);
// 比较两个时间是否相等
boolean equals = dateOld.equals(dateNew);
System.out.println("equals="+equals);
// 比较A时间是否在B时间之前
boolean before = dateOld.before(dateNew);
System.out.println("before="+before);
// 比较A时间是否在B时间之后
boolean after = dateOld.after(dateNew);
System.out.println("after="+after);
// 比较A时间与B时间的先后关系。返回-1表示A时间较早,返回0表示两个时间相等,返回1表示B时间较早
int compareResult = dateOld.compareTo(dateNew);
System.out.println("compareResult="+compareResult);
}
更多Java技术文章参见《Java开发笔记(序)章节目录》
Java开发笔记(三十九)日期工具Date的更多相关文章
- Java开发笔记(十九)规律变化的for循环
前面介绍while循环时,有个名叫year的整型变量频繁出现,并且它是控制循环进出的关键要素.不管哪一种while写法,都存在三处与year有关的操作,分别是“year = 0”.“year<l ...
- Java开发学习(三十九)----SpringBoot整合mybatis
一.回顾Spring整合Mybatis Spring 整合 Mybatis 需要定义很多配置类 SpringConfig 配置类 导入 JdbcConfig 配置类 导入 MybatisConfig ...
- Java开发学习(三十六)----SpringBoot三种配置文件解析
一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...
- Android UI开发第三十九篇——Tab界面实现汇总及比较
Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...
- Java开发笔记(九十九)定时器与定时任务
前面介绍了线程的几种运行方式,不管哪种方式,一旦调用了线程实例的start方法,都会立即启动线程的事务处理.然而某些业务场景在事务执行时间方面有特殊需求,例如期望延迟若干时间之后才开始事务运行,又如期 ...
- Java开发学习(三十二)----Maven多环境配置切换与跳过测试的三种方式
一.多环境开发 我们平常都是在自己的开发环境进行开发, 当开发完成后,需要把开发的功能部署到测试环境供测试人员进行测试使用, 等测试人员测试通过后,我们会将项目部署到生成环境上线使用. 这个时候就有一 ...
- Java开发学习(三十五)----SpringBoot快速入门及起步依赖解析
一.SpringBoot简介 SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程. 使用了 Spring 框架后已经简化了我 ...
- Java学习笔记(十九)——Java 日志记录 AND log4j
[前面的话] 学习的进度应该稍微在快一点. Java日志到了必须学习怎么使用的时候了,因为在项目中要进行使用.基础性文章,选择性阅读. [结构] java日志对调试,记录运行,问题定位都起到了很重要的 ...
- Java学习笔记三十:Java小项目之租车系统
Java小项目之租车系统 一:项目背景介绍: 根据所学知识,编写一个控制台版的“呱呱租车系统” 功能: 1.展示所有可租车辆: 2.选择车型.租车量: 3.展示租车清单,包含:总金额.总载货量以及其车 ...
- Java开发学习(三十)----Maven聚合和继承解析
一.聚合 分模块开发后,需要将这四个项目都安装到本地仓库,目前我们只能通过项目Maven面板的install来安装,并且需要安装四个,如果我们的项目足够多,那么一个个安装起来还是比较麻烦的 如果四个项 ...
随机推荐
- pyhton 监听文件输入实例
def tail(filename): f = open(filename,encoding='utf-8') while True: line = f.readline() if line.stri ...
- python从入门到实践-11章测试模块(测试函数出问题)
#!/user/bin/env python# -*- coding:utf-8 -*- # 用python中unittes中工具来测试代码 # 1.测试函数import unittestfrom n ...
- OpenCV读写摄像头并写入视频
#include <opencv2/opencv.hpp>using namespace cv;#include <iostream>using namespace std; ...
- 对象池----unity中应用
对象池应用在unity中能减少资源消耗,节省内存空间具体原理不再赘述. 以下是他的操作步骤:(注意:对象池中应用到了栈或对队列!) 1).先建立一个(怪物)物体 mMonster; 2).再建立一 ...
- Three.js学习笔记04--纹理
1 纹理由图片组成 3D世界的纹理由图片组成. 将纹理以一定的规则映射到几何体上,一般是三角形上,那么这个几何体就有纹理皮肤了. 首先应该有一个纹理类,其次是有一个加载图片的方法,将这张图片和这个纹 ...
- 麒麟子Cocos Creator实用技巧
大家好,我是麒麟子, 开源棋牌<幼麟棋牌-四川麻将>(泄漏版叫 <达达麻将>)作者,成都幼麟科技创始人. 自09年进入游戏行业以来,不知不觉已经度过了十个春秋. 曾经我也血气方 ...
- C++ : cin.get()函数和cin函数的使用
笔者由于自己忘记了cin函数怎么用,所以这里趁自己复习C++的空子正好可以做做记录. 1.cin>> 用法1:最基本,也是最常用的用法,输入一个数字: #include ...
- JS实现数组去重方法大总结
js数组根据对象中的元素去重: var arr2 = [ { name: "name1", num: "1" }, { name: "name2&qu ...
- CAS实现单点登录SSO执行原理及部署
一.不落俗套的开始 1.背景介绍 单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. CAS框架:CAS(Centra ...
- Websocket实现即时通讯
前言 关于我和WebSocket的缘:我从大二在计算机网络课上听老师讲过之后,第一次使用就到了毕业之后的第一份工作.直到最近换了工作,到了一家是含有IM社交聊天功能的app的时候,我觉得我现在可以谈谈 ...