最近在自己瞎折腾,有一个需求是计算当前日期到指定日期有多少天,用于实现纪念日或倒计时的功能。查阅资料后发现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. PHP代码审计分段讲解(13)

    代码审计分段讲解之29题,代码如下: <?php require("config.php"); $table = $_GET['table']?$_GET['table']: ...

  2. 团队作业4-Day1

    团队作业4-Day1 1. 各个成员在 Alpha 阶段认领的任务 Alpha任务分配 人员 小程序样式实现 吴安冬+吴梓华 小程序js代码及云数据实现 庾艺锋+白军强 项目测试 王泽鑫+赵玮锋 2. ...

  3. 百度前端技术学院-基础-day20-21

    第二十到第二十一天:让你和页面对话 task1 控制元素的显示及隐藏 实现以下功能: 当用户选择了 School 的单选框时,显示 School 的下拉选项,隐藏 Company 的下拉选项 当用户选 ...

  4. TMOOC-1709-小明复仇

    题目描述 小明所在的世界上一共有n个城市,城市间有m条双向道路.小明现在在城市1,他想到位于城市n的小韩隆家询问他为什么没有将自己的五三复原完成.由于小韩隆手下有许多小弟,小明担心自己可能再也回不来, ...

  5. 笨方法学python笔记

    编程是什么 编程就是通过输出一种语言给计算机"听",命令其去执行相应的操作. 我们称我们给计算机下达的命令称为指令.一般说程序就是有多个指令构成的. 计算机需要使用非常多的电路来实 ...

  6. mysql扩展百分位函数(类似SUM)

    mysql扩展百分位函数(类似SUM) 参考:https://my.oschina.net/waterbear/blog/1186744 百度搜索:mysql percentile

  7. js上 十七、数组-3

    十七.数组-3 #课堂案例 \1. 封装一个chunk(arr,size)的函数,把该数组arr按照指定的size分割成若干个数组块. 例如:chunk([1,2,3,4],2) 返回结果:[[1,2 ...

  8. [日常摸鱼]HDU1724 Ellipse-自适应Simpson法

    模板题~ QAQ话说Simpson法的原理我还是不太懂-如果有懂的dalao麻烦告诉我~ 题意:每次给一个椭圆的标准方程,求夹在直线$x=l$和$x=r$之间的面积 Simpson法 (好像有时候也被 ...

  9. 开源项目葫芦藤:IdentityServer4的实现及其运用

    目录 前言 签名证书(Signing Credential) 客户端存储(Client Store) 资源存储(Resource Store) 持久化授权存储(Persisted Grant Stor ...

  10. vscode常用快捷键和插件

    常用快捷键 快捷键 用途 ctrl+· 打开终端 shift+alt+A 块注释 ctrl+/ 行注释 ctrl+shift+F 文件夹查找 ctrl+enter 下方插入一行 ctrl+shift+ ...