java.util.Date - java中的日期类
Date preTime = new Date(long)
long可以是秒级长整时间计算出来的时间差,例如
// 当前时间-1970年的长整-时间差
long preLong = (Long.parseLong(preStr) - START_TIME - timeDiff) * 1000; // 计算到毫秒。
通过date.getTime()
方法即可获取到long类型的时间,但要获取当前时间的long类型Time,就不推荐使用getTime了。
这个时间差即称为时间戳。它是linux和虚拟机系统下最真实最唯一的时间标志。通过时间戳的加减可以精确计算时区(偏移量的计算方法)
也可以传空参构造当前时间:
Date now = new Date()
时区取的就是当前jvm时区,因为Date包不具备在其他时区获取UTC时间的能力,因此需要进行一步转换:
Date utcNow = new Date(System.currentTimeMillis() - TimeZone.getDefault().getRawOffset())
上面System.cuurentTimeMillis()
代替new Date().getTime()
,为推荐用法
java.util.TimeZone - java中的时区类
获取当前java运行环境时区
TimeZone.getDefault()
也可以根据TimeZoneId获取
TimeZone.getTimeZone(String id)
获取当前时区与UTC时区的偏移量
TimeZone.getDefault().getRawOffset()
注意:
获取的偏移量也是long类型,精确到毫秒。结果除以3600000L就是小时数。
偏移量带正负号,是根据时区来的,东八区获得就是正数,如果是UTC-8时区就是负数
java.sql.TimeStamp - 数据库中的通用时间类
TimeStamp是一个sql可读的时间计算类型,在sql中一个TimeStamp的格式和计算精度默认为“yyyy-mm-dd hh:mm:ss”。可以通过long类型构造timeStamp
New Timestamp(System.currentTimeMillis())
java.util.Calendar - 日历类
calendar的用法包括:
// 创建计算器实例:
Calender calender = Calender.getInstance()
// 配置时间:
calender.setTime(Date 时间)
// 配置单位和时差:
calender.add(Integer 单位, Integer 时差)
// 输出计算后的时间:
calender.getTime()
// 设置时间:
calender.set(Calendar.HOUR_OF_DAY, int num)-把当前时间中的小时,设置为对应时间
// 做时区转化:
calender.setTimeZone(TimeZone.getTimeZone(timeZone))
注意:通过add方法做加减法时,参数1单位可选项在Calendar类中,有:
cal1.add(Calendar.DAY_OF_MONTH,1);
cal1.add(Calendar.DAY_OF_YEAR,1);
cal1.add(Calendar.DATE,1);
虽然这三个都能实现日期加1,但推荐使用第三个,因为DAY_OF_MONTH的主要作用是cal.get(DAY_OF_MONTH),用来获得这一天在是这个月的第多少天,Calendar.DAY_OF_YEAR的主要作用是cal.get(DAY_OF_YEAR),用来获得这一天在是这个年的第多少天,还有DAY_OF_WEEK,用来获得当前日期是一周的第几天
java.text.SimpleDateFormat - 时间格式工具
用于转换时间格式,其用法包括:
// 创建时间格式:
DateFormat dateFormat = new SimpleDateFormat(String pattern)
// 格式化时间:返回的是String类型
dateFormat.format(Date 时间),
// 格式化并返回Date
dateFormat.parse(Date 时间),
常用格式包括:
yyyy-MM-dd HH:mm:ss
yyyyMMddHHmmss
yyyyMMddHHmmssSSS
yyyy-MM-dd'T'HH:mm:ss
yyyy-MM-dd'T'HH:mm:ss'Z'
yyyy
yyMMddHH
EEE MMM dd HH:mm:ss z yyyy 这种是Mon Mar 02 13:57:49 CST 2015格式
yyyy-MM-dd
此处需注意大小写,时间格式类似,可能因为大小写产生不一样的意义,例如常用的24小时制格式“yyyy-MM-dd HH:mm:ss”,如果写“yyyy-MM-dd hh:mm:ss”就变成12小时制
java.util.concurrent.TimeUnit - 并发包下的时间单位
不止是一个时间单位属性,还在并发包中承担着控制线程的作用:
TimeUnit. MILLISECONDS.sleep(60);
apache.commons.lang3.time - apache的时间工具
DateUtils
一个好用的时间工具类,提供了时间切割、计算等能力,配合Calendar使用基本可以完成各类时间处理需求
截取
DateUtils.truncate(new Date(), Calendar.Date)
按日期截取,例如2022.11.21 13:55:21截取为2022.11.21 13:00:00
也可以按月、年、时、分、秒截取
在Calendar中有很多可选截取规格:
Date truncate = DateUtils.truncate(date, Calendar.DATE); // 截取到当天零点
Date truncate = DateUtils.truncate(date, Calendar.HOUR_OF_DAY); // 截取到当前所在小时,24小时制
Date truncate = DateUtils.truncate(date, Calendar.DAY_OF_MONTH); // 截取到当月第一天0点
计算
功能比较类似Calendar的计算方法
DateUtils.addDays(Date baseDate, int day)
例如
String simpleDate3 = simpleDateFormat.format(DateUtils.addDays(DateUtils.truncate(now, Calendar.DATE), 2));
当now为2022.11.21 13:55:21,截取后加两天为2022.11.23 13:00:00
FastDateFormat - apache提供的带缓存的时间格式工具
为了解决SimpleDateFormat性能问题,提供了一个带缓存的时间格式转换器
可以快速返回时间格式化工具并格式化时间
Date date = FastDateFormat.getInstance(String pattern).parse(String time);
评论区