java基础——时间操作专题时间API(一)

前言:在日常的开发过程中,时间数据格式的处理往往是我们容易出错的重点,很多查询条件无法生效也是因为时间格式不匹配的过程,因此,借此机会,就来简单整理一下我们日常时间和java中用到的时间有哪些不同,以及时间相关API的操作。

1.时间基础知识

这一部分主要是对于我们日常时间的介绍和java的时间表示形式的大体介绍

1.1 时刻,时间段和时区

首先我们日常生活中常见的就是时间点和时间段了,比如我们要在上午8:30出门,在9:00--12:00要摸鱼工作,这个就是典型的时刻和时间段;再比如我们再和美国的同事交流打电话,然而我们这边是白天,对面却是夜晚,时间点也有所不同,这个就涉及到了时区。

而在java之中,往往使用时间戳(timestamp),给客户端传递某个“时间”,这里的时间就是指具体的时刻,而要表达一个时间去区间,我们往往要传两个时间戳,以用来表示一段时间。除此外,java中还可以用date表示一个具体的时刻,其表现形式也是我们日常所熟悉的年月日时分秒。

而时区则是为了照顾到全球各地区因昼夜不同而导致时间混乱而使用的,1884年在华盛顿召开的一次国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东、西各12个时区)。规定英国(格林尼治天文台旧址)为中时区(零时区)、东1—12区,西1—12区。每个时区横跨经度15度,时间正好是1小时。最后的东、西第12区各跨经度7.5度,以东、西经180度为界。时区内不同时间内有差别,具体的地区的时间的查看可以搜索以下网址:

北京: 22:57 (time.is)https://time.is/zh/Beijing时区_百度百科 (baidu.com)https://baike.baidu.com/item/%E6%97%B6%E5%8C%BA/491122

1.2 四种简写的时区形式

通过时区的了解,你一定已经了解了各个地方的时间,以及一些看不懂的时区简写,比如GMT,CST,UTC,DST等,那下面我们就来详细介绍。

首先来说说 GMT 和 UTC,GMT 和 UTC 有什么区别呢?先说结论:在编程领域,我们可以认为两者完全相同,GMT+8 也就是 UTC+8。GMT是指地球时,是按照地球自转一圈的时间来决定的,但是由于由于地球自转不匀速和自转轴偏角有变化,地球时并不是精确的,而是不断变化的。为了让时间更加精确,人们用原子的共振频率(原子钟)来精确定义“1秒”这个概念,在这个基础上的时间叫做“协调世界时”,也就是我们熟悉的 UTC(Coordinated Universal Time)。

UTC 使用的是更精确的1s,但是由于地球自转不断变慢,导致 GMT 的 1s 不断变长。UTC 通过不规则的加入闰秒来抵消地球自转变慢的影响,以保确保与 GMT 相差不超过0.9秒。UTC 和 GMT 只是学术上有所区别。在我们的编程领域可以认为两者是一样的。

其次来说说CST,CST却同时可以代表如下 4 个不同的时区:

Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00

也就是说CST可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间,我们在ubuntu系统安装界面上常常可以看到这个,这个需要按地区进行具体的区分。

最后再说说夏日节约时间DST,所谓「夏日节约时间」Daylight Saving Time(简称D.S.T.),是指在夏天太阳升起的比较早时,将时钟拨快一小时,以提早日光的使用,在英国则称为夏令时间(Summer Time)。这个构想于1784年由美国班杰明·富兰克林提出来,1915年德国成为第一个正式实施夏令日光节约时间的国家,以削减灯光照明和耗电开支。自此以后,全球以欧洲和北美为主的约70个国家都引用这个做法。目前被划分成两个时区的印度也正在商讨是否全国该统一实行夏令日光节约时间。欧洲手机上也有很多GSM系统的基地台,除了会传送当地时间外也包括夏令日光节约时间,做为手机的时间标准,使用者可以自行决定要开启或关闭。我国在在1986年 ~ 1991年实行了6年 DST。1992年至今暂停实行。

1.3 LocalDate,LocalDateTime和Calendar

在日常生活中,我们常用到日期和时间来表示我们所处的时间,那java是如何用对象表示勒,

在java中使用到了LocalDate对象表示年月日这一时间,用LocalDateTime表示当前的时分秒,

DateTime dateTime = new DateTime("2017-01-05 12:34:23", DatePattern.NORM_DATETIME_FORMAT); //年,结果:2017
int year = dateTime.year();
//季度(非季节),结果:Season.SPRING
Season season = dateTime.seasonEnum();
//月份,结果:Month.JANUARY
Month month = dateTime.monthEnum();
//日,结果:5
int day = dateTime.dayOfMonth();

除此外还有calendar等用于便捷获取月,日,年.具体代码如下:

Calendar cal = Calendar.getInstance();

cal.get(Calendar.YEAR)
cal.get(Calendar.MONTH) + 1
cal.get(Calendar.DATE)

/*获取当前日历的日期的星期数(1:星期天)*/
int weekIndex = cal.get(Calendar.DAY_OF_WEEK);  

2. jdk 中的时间API

Date基础用法

java.sql.Date继承java.util.Date,相关方法也大部分直接调用父类方法。

Calendar升级

Calendar作为一个抽象类,定义日期时间相关转换与计算的方法,

LocalDate , LocalTime 和 LocalDateTime

LocalDate 是对日期的抽象,即年月日。LocalTime 是对时间的抽象,即时分秒。而 LocalDateTime 即是 LocalDate 以及 LocalTime 的结合,表示日期与时间。 以上三者都是在开发时常用到的三种时间表示方式。三者的实例都是不可变对象,每次时间的改变,都会新创建一个对应的对象,所以它们是线程安全的。

Instant

前面提到的日期时间类如 LocalDate ,对人类是友好的,因为它们以我们所属性的方式表现时间。但是对于机器来说,多少年,几号,周几这样的算法是不友好的,而像 UNIX 时间戳这种用数值来表示当前时间点的方式对机器跟为友好。

Duration 和 Period

上面提到的相关时间类表示的是时间点,而 Duration 和 Period 是对时间段的抽象。 Duration 与 Period 的区别在于 Duration 主要是以整数值(秒和纳秒)来表示时间段,而 Period 则是以对人类友好的方式来表示时间段,即一周,一个月,一年等。

参考链接:Java 8 日期、时间 API 总结 - 冰钟的个人空间 - OSCHINA - 中文开源技术交流社区

2.2 时间转换

(1)把Date转化成固定日期格式

//当前时间
Date date = DateUtil.date();
//cal-->date
Date date2 = DateUtil.date(Calendar.getInstance());
//long-->date
Date date3 = DateUtil.date(System.currentTimeMillis());

//当前时间字符串,格式:yyyy-MM-dd HH:mm:ss
String now = DateUtil.now();
//当前日期字符串,格式:yyyy-MM-dd
String today= DateUtil.today();

(2) 把固定时间格式转换为Date

String dateStr = "2017-03-01";
//主动识别
Date date = DateUtil.parse(dateStr);
//自定义格式
Date date = DateUtil.parse(dateStr, "yyyy-MM-dd");

(3) 把时间戳转化为日期格式(Date)

//获取现在的秒级别的时间戳
long time = System.currentTimeMillis() / 1000;

//获取现在的毫秒级别的时间戳
long time = System.currentTimeMillis();

Timestamp ts=new Timestamp(time);

Date date=new Date(ts.getTime());

(4) 时间(Date)转化为时间戳

Date date = new Date();  

long times = date.getTime();  

参考链接:几种时间格式转换_一片蓝蓝的云的博客-CSDN博客

Java将时间戳转换为日期-立地货

3.hutool封装的时间API

考虑到Java本身对日期时间的支持有限,并且Date和Calendar对象的并存导致各种方法使用混乱和复杂,故使用此工具类做了封装.具体可分为如下几部分:

3.1 DateUtil 工具类

DateUtil主要是日期和字符串之间的转换,以及提供对日期的移动

String dateStr = "2017-03-01 22:33:23";
Date date = DateUtil.parse(dateStr);

//常用偏移,结果:2017-03-04 22:33:23
DateTime newDate2 = DateUtil.offsetDay(date, 3);

//常用偏移,结果:2017-03-01 19:33:23
DateTime newDate3 = DateUtil.offsetHour(date, -3);

//常用偏移,结果:2017-04-01 19:33:23
DateTime newDate4 =DateUtil.offsetMonth(date,1);


3.2 日期时间对象-DateTime

考虑工具类的局限性,在某些情况下使用并不简便,于是DateTime类诞生。DateTime对象充分吸取Joda-Time库的优点,并提供更多的便捷方法,这样我们在开发时不必再单独导入Joda-Time库便可以享受简单快速的日期时间处理过程。

构建方式:DateTime.of()和new DateTime()

Date date = new Date();

//new方式创建
DateTime time = new DateTime(date);
Console.log(time);

//of方式创建
DateTime now = DateTime.now();
DateTime dt = DateTime.of(date);
使用方法:获取日期成员(年、月、日等)

DateTime dateTime = new DateTime("2017-01-05 12:34:23", DatePattern.NORM_DATETIME_FORMAT);      
//年,结果:2017
int year = dateTime.year();
//季度(非季节),结果:Season.SPRING
Season season = dateTime.seasonEnum();
//月份,结果:Month.JANUARY
Month month = dateTime.monthEnum();
//日,结果:5
int day = dateTime.dayOfMonth();


3.3 农历工具使用


农历日期,提供了生肖、天干地支、传统节日等方法

构建ChineseDate对象,ChineseDate表示了农历的对象,构建此对象既可以使用公历的日期,也可以使用农历的日期。

//通过公历构建
ChineseDate date = new ChineseDate(DateUtil.parseDate("2020-01-25"));
// 一月
date.getChineseMonth();
// 正月
date.getChineseMonthName();
// 初一
date.getChineseDay();
// 庚子
date.getCyclical();
// 生肖:鼠
date.getChineseZodiac();
// 传统节日(部分支持,逗号分隔):春节
date.getFestivals();
// 庚子鼠年 正月初一
date.toString();

3.4 计时工具TimeInterval

Hutool通过封装TimeInterval实现计时器功能,即可以计算方法或过程执行的时间。

TimeInterval支持分组计时,方便对比时间。

TimeInterval timer = DateUtil.timer();

//---------------------------------
//-------这是执行过程
//---------------------------------

timer.interval();//花费毫秒数
timer.intervalRestart();//返回花费时间,并重置开始时间
timer.intervalMinute();//花费分钟数

详细参照hutool文档:日期时间工具-DateUtil (hutool.cn)

小结:本文总结了关于时间API的一些相关操作,也希望对大家有所帮助

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值