最近在自己瞎折腾,有一个需求是计算当前日期到指定日期有多少天,用于实现纪念日或倒计时的功能。查阅资料后发现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. django 删除数据库表后重新同步的方法

    python manage.py sqlmigrate your_app_name 0001 把your_app_name换成自己的app名字即可看到框架自动生成的创建表sql语句,于是我就这样看到了 ...

  2. 小程序setData 修改数组附带索引解决办法

    this.setData({'judge[current]':true}); 以此句进行修改值,会报错 Error: Only digits (0-9) can be put inside [] in ...

  3. Scrum 冲刺第二天

    一.每日站立式会议 1.会议内容 1)进行每日工作汇报 张博愉: 昨天已完成的工作:制定测试计划.博客编写 今日工作计划:测试mappe里的接口 工作中遇到的困难:对测试接触得较少 张润柏: 昨天已完 ...

  4. 手写线程池,对照学习ThreadPoolExecutor线程池实现原理!

    作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...

  5. 学习笔记:Prufer 编码

    Prufer 编码可以将无根树与序列之间进行转化. 一个 \(n\) 个点.区分编号的无向图 和 Prufer 序列一定是一一对应的,下面会给出映射方式. 借此可以证明 Cayley 定理: \(n\ ...

  6. 【学习笔记】浅析平衡树套线段树 & 带插入区间K小值

    常见的树套树 一般来说,在嵌套数据结构中,线段树多被作为外层结构使用. 但线段树毕竟是 静态 的结构,导致了一些不便. 下面是一个难以维护的例子: 带插入区间 \(k\) 小值问题 来源:Luogu ...

  7. 01_02_py

    1基础知识 1.自然语言 (natural language) 是人们交流所使用的语言,例如英语.西班牙语和法语.它们不是人为设计出来的(尽管有人试图这样做):而是自然演变而来. 2.形式语言 (fo ...

  8. 算法——最长上升子序列(DP和二分)

    给定一个无序的整数数组,找到其中最长上升子序列的长度. 输入: [10,9,2,5,3,7,101,18] 输出: 4 纯DP 解体思路:利用动态规划的方法,从一个方向遍历数组,每次获取以该位置为子序 ...

  9. 蒲公英 · JELLY技术周刊 Vol.34: 芜湖~ Flutter

    蒲公英 · JELLY技术周刊 Vol.34 提及跨端,你能想到那些技术?PWA.小程序.Ionic.React Native.Weex--当然也少不了 Flutter,历时 3 年,Flutter ...

  10. MySQL锁(三)行锁:幻读是什么?如何解决幻读?

    概述 前面两篇文章介绍了MySQL的全局锁和表级锁,今天就介绍一下MySQL的行锁. MySQL的行锁是各个引擎内部实现的,不是所有的引擎支持行锁,例如MyISAM就不支持行锁. 不支持行锁就意味着在 ...