时间:2021-05-20
在系统开发中,日期与时间作为重要的业务因素,起到十分关键的作用,例如同一个时间节点下的数据生成,基于时间范围的各种数据统计和分析,集群节点统一时间避免超时等。
在时间和日期中有几个关键概念:
日期和时间的用法在系统中通常是获取时间和一些常见的计算与格式转换处理,在一些垮时区的业务中就会变的复杂很多,例如在电商业务中的全球贸易或者海淘等。
基础用法
java.sql.Date继承java.util.Date,相关方法也大部分直接调用父类方法。
public class DateTime01 { public static void main(String[] args) { long nowTime = System.currentTimeMillis() ; java.util.Date data01 = new java.util.Date(nowTime); java.sql.Date date02 = new java.sql.Date(nowTime); System.out.println(data01); System.out.println(date02.getTime()); }}打印:Fri Jan 29 15:11:25 CST 20211611904285848计算规则
public class DateTime02 { public static void main(String[] args) { Date nowDate = new Date(); System.out.println("年:"+nowDate.getYear()); System.out.println("月:"+nowDate.getMonth()); System.out.println("日:"+nowDate.getDay()); }}年份:当前时间减去1900;
public int getYear() { return normalize().getYear() - 1900;}月份:0-11表示1-12月份;
public int getMonth() { return normalize().getMonth() - 1;}天份:正常表示;
public int getDay() { return normalize().getDayOfWeek() - BaseCalendar.SUNDAY;}格式转换
非线程安全的日期转换API,该用法在规范的开发中是不允许使用的。
public class DateTime02 { public static void main(String[] args) throws Exception { // 默认转换 DateFormat dateFormat01 = new SimpleDateFormat() ; String nowDate01 = dateFormat01.format(new Date()) ; System.out.println("nowDate01="+nowDate01); // 指定格式转换 String format = "yyyy-MM-dd HH:mm:ss"; SimpleDateFormat dateFormat02 = new SimpleDateFormat(format); String nowDate02 = dateFormat02.format(new Date()) ; System.out.println("nowDate02="+nowDate02); // 解析时间 String parse = "yyyy-MM-dd HH:mm"; SimpleDateFormat dateFormat03 = new SimpleDateFormat(parse); Date parseDate = dateFormat03.parse("2021-01-18 16:59:59") ; System.out.println("parseDate="+parseDate); }}作为JDK初始版本就使用的日期和时间,Date类一直在项目中使用,但是相关API的方法都已经基本废弃,通常使用一些二次封装的时间组件。该API的设计堪称Java中的最烂。
Calendar作为一个抽象类,定义日期时间相关转换与计算的方法,这个类目测
public class DateTime04 { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR,2021); calendar.set(Calendar.MONTH,1); calendar.set(Calendar.DAY_OF_MONTH,12); calendar.set(Calendar.HOUR_OF_DAY,23); calendar.set(Calendar.MINUTE,59); calendar.set(Calendar.SECOND,59); calendar.set(Calendar.MILLISECOND,0); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ; Date defDate = calendar.getTime(); System.out.println(defDate+"||"+dateFormat.format(defDate)); }}输出:Fri Feb 12 23:59:59 CST 2021||2021-02-12 23:59:59直观感觉,Date中相关方法迁移Calendar实现,简化Date的功能侧重对日期与时间的实体封装,Calendar复杂相关计算策略,DateFormat依旧用来做格式处理。但是Calendar依旧很少被使用,上述基础API就已经是很好的说明了。
Java8之后的版本中,核心API类包括LocalDate-日期、LocalTime-时间、LocalDateTime-日期加时间。
如果作为JodaTime组件的深度用户,对这个几个API使用基本无压力。
时间戳也是业务中常用的方式,基于Long类型表示时间,在很多时候远比常规日期与时间的格式更好用。
public class DateTime06 { public static void main(String[] args) { // 精确到毫秒级别 System.out.println(System.currentTimeMillis()); System.out.println(new Date().getTime()); System.out.println(Calendar.getInstance().getTime().getTime()); System.out.println(LocalDateTime.now().toInstant( ZoneOffset.of("+8")).toEpochMilli()); }}这里需要注意的是在实际业务中由于获取时间戳的方式是多样的,所以建议统一工具方法,和规定精确度,避免部分精确到秒部分精确到毫秒的问题,这样可以规避在使用时相互转换的情况。
在Java8之前JodaTime组件是大部分系统中的常见选择,有很多方便好用的日期与时间的处理方法封装。
基础依赖:
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId></dependency>在joda-time提供的组件之上做一个简单的工具类封装,保证业务处理风格统一。
public class JodaTimeUtil { // 时间格式 public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; private JodaTimeUtil (){} // 获取当前时间 public static DateTime getCurrentTime (){ return new DateTime() ; } // 获取指定时间 public static DateTime getDateTime (Object obj){ return new DateTime(obj) ; } // 把时间以指定格式转换为字符串 public static String getNowDate (Date date, String format){ return new DateTime(date).toString(format) ; } // 获取星期时间 public static String getWeek (Object date){ DateTime time = getDateTime (date) ; String week = null ; switch (time.getDayOfWeek()) { case DateTimeConstants.SUNDAY: week = "星期日"; break; case DateTimeConstants.MONDAY: week = "星期一"; break; case DateTimeConstants.TUESDAY: week = "星期二"; break; case DateTimeConstants.WEDNESDAY: week = "星期三"; break; case DateTimeConstants.THURSDAY: week = "星期四"; break; case DateTimeConstants.FRIDAY: week = "星期五"; break; case DateTimeConstants.SATURDAY: week = "星期六"; break; default: break; } return week ; }}GitHub·地址
https://github.com/cicadasmile/java-base-parent
GitEE·地址
https://gitee.com/cicadasmile/java-base-parent
以上就是Java 日期与时间API相关用法总结的详细内容,更多关于Java 日期与时间api的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Java8推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。Java处理日期、日历和时间的方式一直为社区所诟病,将java.u
本文实例主要是关于Java8中的新特性,时间日期api的相关实例,具体如下:packagecom.effective.common.base.date;impo
本文实例讲述了PHP获取指定日期是星期几的实现方法。分享给大家供大家参考,具体如下:更多关于PHP相关内容感兴趣的读者可查看本站专题:《php日期与时间用法总结
LocalDate、LocalTime、LocalDateTime是Java8开始提供的时间日期API,主要用来优化Java8以前对于时间日期的处理操作。然而,
Java8在包java.time下包含了一组全新的时间日期API。下面的例子展示了这组新API里最重要的一些部分:1.Clock时钟Clock类提供了访问当前日