java8之前_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外其他皆为小写的单词首字母。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值