最近在自己瞎折腾,有一个需求是计算当前日期到指定日期有多少天,用于实现纪念日或倒计时的功能。查阅资料后发现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. [SQL Server]多次为 '派生表' 指定了列 'id'

    问题: 原因: 因为派生表oo中出现了两个同样的'ID'属性,所以会报[多次为 'o' 指定了列 'ID']的错误. 只需要把第二个星号替换成所需要的列名并把重复字段重命名就好了 解决方案:

  2. 题解-CF429C Guess the Tree

    题面 CF429C Guess the Tree 给一个长度为 \(n\) 的数组 \(a_i\),问是否有一棵树,每个节点要么是叶子要么至少有两个儿子,而且 \(i\) 号点的子树大小是 \(a_i ...

  3. nginx学习之——信号控制和配置

    一.信号控制 1)TERM, INT   Quick shutdown  \\麻溜停掉(暴力停止),一般不常用 // 启动和停止nginx 当前目录:/usr/local/bin/nginx 启动: ...

  4. 使用Tomcat Native提升Tomcat IO效率

    目录 简介 Tomcat的连接方式 APR和Tomcat Native 在tomcat中使用APR 简介 IO有很多种,从最开始的Block IO,到nonblocking IO,再到IO多路复用和异 ...

  5. Typora快捷使用方式

    快捷使用: 1.一级标题 # + 空格 + 内容 2.六级标题 # + 空格 + 内容 3.有序序号 1. + 空格 + 内容 4.无序序号 -+ 空格.*+空格.++空格 5.代码块 ```pyth ...

  6. 工作笔记——CPLD与MCU通过SPI通信

    一.需求描述 MCU需要接收来自CPLD的升级固件数据 CPLD对MCU只进行发送数据,不接收MCU的数据 CPLD无法告知数据传输的开始和结束,需要MCU自行判断(CPLD只是数据透传,不做数据判断 ...

  7. Redis存储对象(序列化和反序列化)

    代码以及实例: package com.hp.test; import redis.clients.jedis.Jedis; import java.io.*; public class Test3 ...

  8. Day11 python高级特性-- 迭代器 Iterator

    直接可以作用于for循环的数据类型有以下几种:   •  集合数据类型:        list.tuple.dict.set.str   •  Generator:        生成器 和 带 y ...

  9. Fastjson 1.2.47 远程命令执行漏洞复现

    前言 这个漏洞出来有一段时间了,有人一直复现不成功来问我,就自己复现了下,顺便简单记录下这个漏洞原理,以便后面回忆. 复现过程 网上已经有很多文章了,这里就不在写了.主要记录一下复现过程中遇到的问题 ...

  10. Mybatis(二)--SqlMapConfig.xml配置文件

    一.简介 SqlMapConfig.xml是Mybatis的全局配置文件,我们在写mybatis项目时,在SqlMapConfig.xml文件中主要配置了数据库数据源.事务.映射文件等,其实还有很多配 ...