Java 日期时间总结

Java中日期概述

        日期在Java中是一块很复杂的内容,对于一个日期在不同的语言国际环境中日期的国际化,日期和时间的相互转换,日期的运算,日期的展现格式等都是比较复杂的问题,为此Java提供了一些日期相关类来解决这些问题。

java.util.Date

        Java中的Date类表示特定的瞬间,精确到毫秒,Java中所有的时间都是由该类来表示,也是该类来实现与持久层和显示层的时间数据交互。但对于时间的格式化和运算确是通过其它类来实现的。在JDK1.1前,Date类也有一些用来获取或者是处理时间的方法,不过从JDK1.1后就被取代掉了,使用DateFormat类来格式化和解析日期字符串,使用Calendar类实现日期和时间字段之间转换。不管使用DateFormat后让时间以什么样的形式展现出来,使用Calender类对时间做了怎样的修改,Date类永远没有变化;Date的格式没有发生任何变化,唯一发生变化的仅仅是里面的值;所有Date类型数据格式都是一样的。

下面是Date常见的方法

Date(); // 构造函数,默认是系统当前时间

Date(long date); // 构造方法,基准时间到指定时间的毫秒数

boolean after(Date when); // 测试时间是否在指定日期之后

boolean before(Date when); // 测试时间是否在指定日期之前

int compareTo(Date anotherDate); // Date类重写了compareTo方法,实现了时间的比较

long getTime(); // 返回基准时间到该时间之间的毫秒数 

void setTime(long time); // 以基准时间为起点,加毫秒数来设置Date对象

import java.util.Date;

public class DateDemo {
	public static void main(String args[]) throws Exception{
		// 创建对象,默认为系统当前时间
		Date d1 = new Date();
		// 打印系统当前时间
		System.out.println("当前时间:" + d1.toString());
		// 设置对象时间
		Date d2 = new Date(1338408932730L);
		System.out.println("d2时间:" + d2.toString());
		// 时间比较
		System.out.println("d1大于d2:" + d1.after(d2));
		System.out.println("d1小于d2:" + d1.before(d2));
		System.out.println("copareTo比较结果:" + d1.compareTo(d2));
		// 时间毫秒数的设置与获取
		d2.setTime(d2.getTime() + 10000*10000);
		System.out.println(d2.getTime());
	}
}

java.text.DateFormat

        DateFormat是日期/时间格式化抽象类,它以与语言无关的方式格式化并解析日期或时间,也就是说该类负责实现Date类型与String类型的相互转换。DateFormat作为一个抽象类是无法创建对象的,但其可以使用静态工厂的方法,创建子类对象来完成相关转换操作,实际上还是由SimpleDateFormat类来完成的。

DateFormat的方法较多,这里就列举些常用的方法。

-- 获取DateFormat实例,DateFormat是抽象类,但为了方便使用,提供了获取实例的静态方法。下面只给出三个不带参数的方法,个人认为带参数指定格式的方法,使用复制,并且不常见,故省略。如果不是默认的格式,使用自定义格式会更方便些。

// 获取日期格式器,该格式器具有默认语言环境的默认格式化风格

static DateFormat getDateInstance(); 

// 获取日期/时间格式器,该格式器具有默认语言环境的默认格式化风格

static DateFormat getDateTimeInstance();

// 获取时间格式器,该格式器具有默认语言环境的默认格式化风格

static DateFormat getTimeInstance();

-- Date类型和文本类型的相互转化方法

String format(Date date); // 将一个Date格式化为日期/时间字符串

Date parse(String source); // 从给定字符串的头部开始解析,以生成一个日期

        SimpleDateFormat是DateFormat的子类,用来创建用户自定义的日期-时间格式器。但还是建议通过DateFormat中的getDateInstance()、getTimeInstance()或getDateTimeInstance()来创建日期-时间格式器,根据需要使用applyPattern方法来修改模式。看到这里大家可能会有疑问。

        DateFormat中的方法返回的是DateFormat对象(API提供的),而在DateFormat类中又没有applyPattern方法,这怎么用?使用SimpleDateFormat类来创建用户自定义的日期-时间格式器,用的好好的,为什么建议使用DateFormat中的方法来创建格式器,再用applyPattern方法来修改模式?

        第一个问题:查看源码我们发现,DateFormat中的方法其实返回是就SimpleDateFormat对象,所以我们只需要将返回的DateFormat对象强转成SimpleDateFormat对象,自然就能调用SimpleDateFormat中的applyPattern()来修改模式;第二个问题:底层用的都是SimpleDateFormat类,但通过DateFormat中方法获取实例,使用的是工厂模式(好处参照java工厂模式),所以相对于new SimpleDateFormat(),JDK建议使用DateFormat中的方法来获取格式器。

下面介绍下SimpleDateFormat类的常用方法

SimpleDateFormat(); // 用默认的模式和默认语言环境的日期格式

SimpleDateFormat(String pattern); //用给定的模式和默认语言环境的日期格式

void applyPattern(String pattern); // 修改日期-时间格式器的模式

String toPattern(); // 返回该日期-时间格式器的模式字符串

下面是DateFormat的一段演示的实例

package com;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormatDemo {
	public static void main(String args[]) throws Exception {
		showDateFormat();
		showSimpleDateFormat();
	}
	// DateFormat常用方法演示
	public static void showDateFormat() throws Exception {
		Date date = new Date();
		// 获取常用默认格式器
		DateFormat df1 = DateFormat.getDateInstance();
		DateFormat df2 = DateFormat.getDateTimeInstance();
		DateFormat df3 = DateFormat.getTimeInstance();
		// 对Date对象按指定的格式来格式化
		System.out.println("date: " + df1.format(date));
		System.out.println("dateTime: " + df2.format(date));
		System.out.println("time: " + df3.format(date));
		
		// 将文本类型按指定格式转成Date对象
		String sd1 = "2015-8-1";
		String sd2 = "2015-8-1 18:36:35";
		String sd3 = "18:36:35";
		// 解析时需要保证字符串的格式和DateFormat的格式匹配
		Date d1 = df1.parse(sd1);
		Date d2 = df2.parse(sd2);
		Date d3 = df3.parse(sd3);
		System.out.println(df2.format(d1));
		System.out.println(df2.format(d2));
		System.out.println(df2.format(d3));
		
		// 修改格式器
		SimpleDateFormat sdf = (SimpleDateFormat) DateFormat.getDateInstance();
		System.out.println(sdf.toPattern() + ": " + sdf.format(date));
		sdf.applyPattern("yyyy-MM-dd HH:mm:ss");
		System.out.println(sdf.toPattern() + ": " + sdf.format(date));
	}
	// SimpleDateFormat常用方法演示
	public static void showSimpleDateFormat() {
		Date date = new Date();
		// 创建指定模式的格式器
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println(sdf.format(date));
		// 修改格式器的模式
		sdf.applyPattern("yy-MM-dd hh:mm aaa");
		System.out.println(sdf.format(date));
		// 获取格式器的模式字符串
		System.out.println(sdf.toPattern());
	}
}

java.util.Calendar

        Calendar是一个抽象类,是系统时间的抽象表示,为操作日历提供了一些方法,并且能将操作后的结果转换成Date对象,其实Calendar类就是用来负责Date对象值的修改操作。Calendar是抽象类,自然就无法创建对象,但是可以通过getInstance()来获取Calendar对象实例(其实是子类对象实例,与上面的DateFormat类似,也是通过获取GregionCalendar子类对象来实现的,不同的是底层的实现原理有点不同,这里没有用工厂模式,是直接创建的,于是API也就没有推荐使用getInstance()来获取实例)。

下面介绍下Calendar类的常用方法

//  获取一个默认时区和指定语言环境的Calendar实例,

static Calendar getInstance();

-- Date类与Calendar类的相互转化

// 返回一个Calendar时间值的Date对象

Date getTime();

// 用给定的Date设置此Calendar的时间

void setTime(Date date);

--  Long类与Calendar类的相互转化

// 获取Calendar的时间值,以毫秒为单位

long getTimeInMillis();

// 用给定的long值设置此Calendar的当前时间值

void setTimeInMillis(long millis);

--  对日历时间的修改

// 根据日历的规则,为给定的日历字段添加或减去指定的时间量

void add(int field, int amount);

// 返回给定日历字段的值

int get(int field);

// 设置给定日历字段的值

void set(int field, int value);

// 设置日历年月日的值

void set(int year, int month, int date);

// 设置日历年月日时分的值

void set(int year, int month, int date, int hour, int minute);

// 设置日历年月日时分秒的值

void set(int year, int month, int date, int hour, int minute, int second);

        GregorianCalendar类是Calendar类子类,用来创建日期对象实例,日历类功能的实现还是通过GregorianCalendar类来实现的。GregorianCalendar类自己的方法较少这里就不列举了。下面通过一段实例来体验Calendar的用法。

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class CalendarDemo {
	public static void main(String args[]) throws Exception{
		showCalendar();
	}
	public static void showCalendar() {
		Date date = new Date();
		date.setTime(1338584503063L);
		
		// 获取Calender实例
		Calendar cd = Calendar.getInstance();
		// 获取Calendar中当前的Date对象
		System.out.println(cd.getTime());
		// 用Date对象设置Calendar对象的值
		cd.setTime(date);
		System.out.println(cd.getTime());
		
		// 用long值设置此Calendar的当前时间
		cd.setTimeInMillis(1538584503063L);
		System.out.println(cd.getTime());
		// 获取Calendar中的时间值
		System.out.println(cd.getTimeInMillis());
		
		// 为指定日历字段添加指定时间量
		cd.add(5, 30);
		System.out.println(cd.getTime());
		// 设置给定日历字段的值
		cd.set(5, 30);
		System.out.println(cd.getTime());
		// 获取给定日历字段的值
		System.out.println(cd.get(1));
		// 设置年月日时分秒
		cd.set(2015, 8, 3, 15, 13, 30);
		System.out.println(cd.getTime());
	}
	public static void showGregionCalendar() {
		// 创建一个GregorianCalendar对象gc,gc与上面的cd使用基本类似
		// 其实cd是被向上转型的gc,这里就不重复演示了
		GregorianCalendar gc = new GregorianCalendar();
	}
}

Java中日期常用总结

Java中日期的常用方法有以下三个方面:

1、日期的创建;

2、日期的格式化显示与转换(主要是Date与String间的转换);

3、日期中年、月、日、时、分、秒、星期的获取与修改,还有日期的比较;

        第一条就比较简单了,第二条就是通过DateFormat类来实现的,第三条就是通过Calendar类来实现的;理清楚了它们之间的关系,具体功能参照下API就可以了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值