Java 8 之前的时间处理
最近在自己瞎折腾,有一个需求是计算当前日期到指定日期有多少天,用于实现纪念日或倒计时的功能。查阅资料后发现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 之前的时间处理的更多相关文章
- Java Calendar 类的时间操作
Java Calendar 类的时间操作 标签: javaCalendar时间Date 2013-07-30 17:53 140401人阅读 评论(7) 收藏 举报 分类: 所有(165) Java ...
- Java与数据库之间时间的处理
Java与数据库之间时间的处理 在数据库中建表: DROP TABLE IF EXISTS `times`; CREATE TABLE `times` ( `id` int(11) NOT NULL ...
- Java获取各种常用时间方法大全
Java获取各种常用时间方法大全 package cc.javaweb.test; Java中文网,Java获取各种时间大全 import java.text.DateFormat; import j ...
- java获取系统指定时间年月日
java获取系统指定时间年月日 private String setDateTime(String falg) { Calendar c = Calendar.getInstance(); c.set ...
- Java和JavaScript的时间互传
原创文章,转载请注明:Java和JavaScript的时间互传 By Lucio.Yang 1.从JavaScript到Java JavaScript: function query(){ var s ...
- Java获取当前的时间
Java获取当前的时间 1.利用Java中的Calendar获取当前的时间 具体实现如下: /** * @Title:NowTime.java * @Package:com.you.model * @ ...
- java 获取系统当前时间并格式化
java 获取系统当前时间并格式化 CreateTime--2018年5月9日11:41:00 Author:Marydon 实现方式有三种 updateTime--2018年7月23日09点32 ...
- Java-Runoob-高级教程-实例-时间处理:02. Java 实例 - 获取当前时间
ylbtech-Java-Runoob-高级教程-实例-时间处理:02. Java 实例 - 获取当前时间 1.返回顶部 1. Java 实例 - 获取当前时间 Java 实例 以下实例演示了如何使 ...
- [Java]如何把当前时间插入到数据库
[Java]如何把当前时间插入到数据库 1.在orderDao.java中 /** 设置订单*/ public void setOrder(Order order){ Date time = new ...
- Java 8新的时间日期库的20个使用示例
原文链接 作者:Javin Paul 译者:之诸暇 除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学 ...
随机推荐
- 攻防世界 web进阶区 ics-06
攻防世界 ics-06 涉及知识点: (1)php://filter协议 (2)php中preg_replace()函数的漏洞 解析: 进入题目的界面,一通乱点点出了唯一一个可以进入的界面. 观察ur ...
- python socket 聊天室
socket 发送的时候,使用的是全双工的形式,不是半双工的形式.全双工就是类似于电话,可以一直通信.并且,在发送后,如果又接受数据,那么在这个接受到数据之前,整个过程是不会停止的.会进行堵塞,堵塞就 ...
- Scrum 冲刺 第二篇
Scrum 冲刺 第二篇 每日会议照片 昨天已完成工作 队员 昨日完成任务 黄梓浩 初步完成app项目架构搭建 黄清山 完成部分个人界面模块数据库的接口 邓富荣 完成部分后台首页模块数据库的接口 钟俊 ...
- 理解java底层通讯协议
引言: 本周自己重新对底层通讯方式进行了学习,在此做一个输出. 分别从客户端发送多个请求的需求角度与服务端接收多个连接发送请求的需求角度,剖析4种基于java自身技术实现的消息方式通讯所带来的影响,解 ...
- 学习笔记:舞蹈链 Dancing Links
这是一种奇妙的算法用来解决两个问题: 精确覆盖问题:给定一个矩阵,每行是一个二进制数,选出尽量少的行,使得每一列恰好有一个 \(1\) 重复覆盖问题:给定一个矩阵,每行是一个二进制数,选出尽量少的行, ...
- c++ 解析yaml文件
一直用c++操作ini做配置文件,想换成yaml,在全球最大的同性交友网站github上搜索,看有没有开源的库,功夫不负有心人,找到了yaml-cpp,用他解析了一个yaml的例子非常好使,分享一下如 ...
- js上 二.JavaScript基本语法
1.JavaScript词法结构 所谓词法结构是指一套基础性规则,用来描述如何使用这门语言来编写程序,包括如下几项: ü 字符集unicode ü 区分大小写 (true和TRUE) ü 忽略空白字符 ...
- 使用js方法将table表格中指定列指定行中相同内容的单元格进行合并操作。
前言 使用js方法对html中的table表格进行单元格的行列合并操作. 网上执行此操作的实例方法有很多,但根据实际业务的区别,大多不适用. 所以在网上各位大神写的方法的基础上进行了部分修改以适合自己 ...
- 【老孟Flutter】2020年总结
2020年是我经历的最不平凡的一年,这一年有遗憾.有收获,有感概,也有庆幸,庆幸自己还活着. 用一句话总结自己的2020,忙并收获着,累并快乐着. <Flutter 实战入门> <F ...
- SQL Server中datetimeset转换datetime类型问题浅析
在SQL Server中,数据类型datetimeoffset转换为datetime类型或datetime2类型时需要特别注意,有可能一不小心你可能会碰到下面这种情况.下面我们构造一个简单案例,模拟一 ...