最近在自己瞎折腾,有一个需求是计算当前日期到指定日期有多少天,用于实现纪念日或倒计时的功能。查阅资料后发现Java 8之前的时间日期处理很是麻烦而且被频频吐槽,以至于后来在 Java 8 中推出了一个专门的 time 包。虽然学习编程最忌守旧,但是老版本的处理方式在 Java 8 或以上版本中并没有废除并且还有很多项目仍在使用,所以我们还是很有必要学习老版本的 api。

日历类Calendar

Calendar是一个使用单例设计模式的抽象类,封装了如YEAR、MONTH、DATE、SUNDAY(一个星期的七天)和JANUARY(一年的十二个月)等诸多日历字段,并提供了一些操作字段的方法。

构造方法

Calendar是典型的单例设计模式,构造函数不对外暴露,使用getInstance()方法获得日历对象。

  • static Calendar getInstance(); 使用默认时区和语言环境获得一个日历,此外还有多个重载用于获得指定语言环境、时区下的日历对象。

主要方法

get

int get(int field); 返回给定日历字段的值

Calendar cal = Calendar.getInstance();
//调用get函数获取日历对象的年、月、日字段
//get函数传入的参数为Calendar封装好的字段
String days = cal.get(Calendar.YEAR)+"年"
+cal.get(Calendar.MONTH)+"月"+cal.get(Calendar.DATE)+"日";
//输出检验
System.out.println("今天是:");
System.out.println(days);

set

  • void set(int field, int value); 将给定的日历字段设置为给定值
  • void set还有诸如set(int year, int month, int date)等多个重载用于设定日历字段
cal.set(Calendar.YEAR,2017);//将cal对象表示的时间的年份设置为2017年

cal.set(2017,Calendar.FEBRUARY,24);//将cal对象表示的时间设置为2017年2月24日

//可以将这两句代码分别插入上一段的1、2行之间进行测试
//值得一提的是,Calendar类中将一月JANUARY字段的值定义为0,FEBRUARY的值定义为1
//所以在set函数的参数中使用月份时整数0表示1月,1表示二月并以此类推
//推荐使用Calendar.FEBRUARY等字段以提高代码可读性

add

  • void add(int field, int amount); 根据日历的规则,为给定的日历字段添加或减去指定的时间量。
Calendar cal = Calendar.getInstance();
//调用get函数获取日历对象的年、月、日字段
//get函数传入的参数为Calendar封装好的字段
String days = cal.get(Calendar.YEAR)+"年"
+cal.get(Calendar.MONTH)+"月"+cal.get(Calendar.DATE)+"日";
//输出检验
System.out.println("今天是:");
System.out.println(days); cal.add(Calendar.MONTH,1);
String nextMonth = cal.get(Calendar.YEAR)+"年"
+cal.get(Calendar.MONTH)+"月"+cal.get(Calendar.DATE)+"日"; System.out.println("一个月后是:");
System.out.println(nextMonth);

其他方法

  • long getTimeInMillis(); 返回此 Calendar 的时间值,以毫秒为单位。

日期类Date

Date类是自Java诞生就有的类,也是少数槽点较多的类之一,自Calendar诞生后Date中大多数方法都被取代,但是要使用日期格式化类按要求获取日期和时间,Date类还是必不可少的。

构造方法

  • Date(); 分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)
  • Date(long time); 分配Date对象并初始化此对象,以表示自从协调世界时以来的指定的毫秒数

主要方法

  • boolean after(Date when); 测试此日期是否在指定日期之后
  • boolean before(Date when); 测试此日期是否在指定日期之前
  • long getTime(); 返回此 Date对象对协调世界时相差的毫秒数
  • Date parse(String text); 根据指定的字符串生成一个Date对象
Date nowdays = new Date();
System.out.println(nowdays);
//输出结果为Tue Feb 13 11:18:33 CST 2018
//先用Calendar获取一个指定时间的毫秒值
Calendar calendar = Calendar.getInstance();
calendar.set(2017,Calendar.FEBRUARY,24,0,0,0);
//用指定日期的毫秒值初始化Date对象并输出检验
Date day = new Date(calendar.getTimeInMillis());
System.out.println(day);
//输出结果Fri Feb 24 00:00:00 CST 2017

日期格式化类

Java作为当前最火热的编程语言之一,在日期时间处理的功能上必定要考虑到不同时区、不同习惯导致的语言和习惯差别。为了解决这个问题,在java.text包中提供了DateFormat和SimpleDateFormat两个类。

DateFormat

DateFormat用于根据要求格式化或标准化日期和时间对象,其提供了多个类似的方法以获得基于默认或给定语言环境和多种格式化风格的默认日期/时间 Formatter。使用DateFormat时一般先获取到格式化器,然后通过format方法传入Date对象将数据格式化为字符串。

获取格式化器

  • static DateFormat getDateInstance(); 获取默认情况下格式化日期的实例对象
  • static DateFormat getTimeInstance(); 获取默认情况下格式化时间的实例对象
  • static DateFormat getDateTimeInstance(); 获取默认情况下格式化日期和时间的实例对象
  • 以上前两个个方法还分别有单个参数的(指定风格)、两个参数的(指定风格和语言环境)的重载;第三个方法还有两个参数(指定风格)、三个参数(指定风格和语言环境)的重载;所以DateFormat共有九个方法可以获取格式化器

格式化Date对象

  • String format(Date date); 将一个 Date 格式化为日期/时间字符串
Date date = new Date();
DateFormat df = null; //默认风格的日期格式化器
df = DateFormat.getDateInstance();
System.out.println(df.format(date)); //SHORT风格的日期格式化器
df = DateFormat.getDateInstance(DateFormat.SHORT);
System.out.println(df.format(date)); //两次输出结果
//2018年2月13日
//2018/2/13
Date date = new Date();
DateFormat df = null; //默认风格的时间格式化器(中文、中国风格)
df = DateFormat.getTimeInstance();
System.out.println(df.format(date)); //美式英语、美国风格的日期格式化器
df = DateFormat.getTimeInstance(DateFormat.SHORT,new Locale("en_us","as"));
System.out.println(df.format(date)); //两次输出结果
//下午12:12:44
//12:12:44 CST

SimpleDateFormat

顾名思义,SimpleDateFormat是一个很简便的日期格式化类。它是DateFormat的子类,重写了format方法,使用时可以通过获取格式化器对象,此格式化器对象用正则表达式的方式格式化文本。

构造方法

  • SimpleDateFormat(); 用默认的模式和默认语言环境的日期格式符号构造格式化器

  • SimpleDateFormat(String pattern); 用给定的模式构造格式化器

其他方法

  • String format(Date date); 将一个 Date 格式化为日期/时间字符串
Date date = new Date();
SimpleDateFormat sdf = null; sdf = new SimpleDateFormat("yyyy年MM月dd日hh时mm分");
System.out.println(sdf.format(date));
//输出结果
//2018年02月13日12时53分 sdf = new SimpleDateFormat("yyyy/MM/dd");
System.out.println(sdf.format(date));
//输出结果
//2018/02/13

正则规则

SimpleDateFormat是利用正则表达式来格式化日期的,在文档中将其称之为“模式字母”,在常用的模式字母中,除月份用M分钟用m外其他皆为小写的单词首字母。

Java 8 之前的时间处理的更多相关文章

  1. Java Calendar 类的时间操作

    Java Calendar 类的时间操作 标签: javaCalendar时间Date 2013-07-30 17:53 140401人阅读 评论(7) 收藏 举报 分类: 所有(165) Java ...

  2. Java与数据库之间时间的处理

    Java与数据库之间时间的处理 在数据库中建表: DROP TABLE IF EXISTS `times`; CREATE TABLE `times` ( `id` int(11) NOT NULL ...

  3. Java获取各种常用时间方法大全

    Java获取各种常用时间方法大全 package cc.javaweb.test; Java中文网,Java获取各种时间大全 import java.text.DateFormat; import j ...

  4. java获取系统指定时间年月日

    java获取系统指定时间年月日 private String setDateTime(String falg) { Calendar c = Calendar.getInstance(); c.set ...

  5. Java和JavaScript的时间互传

    原创文章,转载请注明:Java和JavaScript的时间互传 By Lucio.Yang 1.从JavaScript到Java JavaScript: function query(){ var s ...

  6. Java获取当前的时间

    Java获取当前的时间 1.利用Java中的Calendar获取当前的时间 具体实现如下: /** * @Title:NowTime.java * @Package:com.you.model * @ ...

  7. java 获取系统当前时间并格式化

      java 获取系统当前时间并格式化 CreateTime--2018年5月9日11:41:00 Author:Marydon 实现方式有三种 updateTime--2018年7月23日09点32 ...

  8. Java-Runoob-高级教程-实例-时间处理:02. Java 实例 - 获取当前时间

    ylbtech-Java-Runoob-高级教程-实例-时间处理:02. Java 实例 - 获取当前时间 1.返回顶部 1. Java 实例 - 获取当前时间  Java 实例 以下实例演示了如何使 ...

  9. [Java]如何把当前时间插入到数据库

    [Java]如何把当前时间插入到数据库 1.在orderDao.java中 /** 设置订单*/ public void setOrder(Order order){ Date time = new ...

  10. Java 8新的时间日期库的20个使用示例

    原文链接 作者:Javin Paul 译者:之诸暇 除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学 ...

随机推荐

  1. CNVD漏洞证书(2)

    第二张CNVD的原创漏洞证书. 关于证书申请可以看我之前写的这篇博客: https://www.cnblogs.com/Cl0ud/p/12720413.html 继续加油

  2. 极光实验室 第一次考核wp

    第一道题: 上来就让我买flag,用御剑扫目录,发现了这道题有源码index.php.bak!直接下载. <meta charset='UTF-8'> <title>极光实验室 ...

  3. CSP-S2020 浙江 游记

    2020.10.9 今天是 \(2020\) 年 \(10\) 月 \(9\) 日,距离初赛还有两天(算两天吗,完整的应该只有一天多了). 原本对于比赛还是没什么感觉的,每天做做题,水水文章,感觉时间 ...

  4. jwt与springcloud联用

    图片来源与博客:https://www.jianshu.com/p/99a458c62aa4 分布式权限管理参考:https://blog.csdn.net/qq_36236890/article/d ...

  5. css 10-CSS3选择器详解

    10-CSS3选择器详解 #CSS3介绍 CSS3在CSS2基础上,增强或新增了许多特性, 弥补了CSS2的众多不足之处,使得Web开发变得更为高效和便捷. #CSS3的现状 浏览器支持程度不够好,有 ...

  6. 阿里云视频点播之URL批量拉取上传(调整为多个视频上传)

    项目引入阿里云视频点播PHP-SDK 背景:2021年乐视云的点播将停止提供服务,项目决定选择选用阿里云的视频的点播.在上线前,需要将之前的视频提前导入资源库,URLS方式拉取是比较方便的,对编辑同事 ...

  7. 探究 | App Startup真的能减少启动耗时吗

    前言 之前我们说了启动优化的一些常用方法,但是有的小伙伴就很不屑了: "这些方法很久之前就知道了,不知道说点新东西?比如App Startup?能对启动优化有帮助吗?" ok,既然 ...

  8. 为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate

    一.前言 因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template. Hibe ...

  9. 在Linux下面端口映射socat自动脚本

    这个sh脚本可以方面的端口映射,在使用本功能之前请确保socat已经放到了/usr/bin/socat #!/bin/bash cd `dirname $0` let listenport=`base ...

  10. 搜索引擎优化(SEO)解决方案

      搜索引擎优化(SEO)解决方案 在此之前,希望大家能重新审视搜索引擎,通俗来讲就是我们日常所用的百度.谷歌.搜狗.雅虎等.磨刀不误砍柴工,知己知彼,百战不殆! 一.搜索引擎是什么? 搜索引擎(Se ...