Java中的日期与时间类 -- Date

1. Java中的日期

日期在 Java 中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式都是非常复杂的问题。

在 Java 中,操作日期主要涉及到一下几个类: 

  • (1)java.util.Date(最基本的日期时间类)  
  • (2)java.text.DateFormat(抽象类) 
  • (3)java.text.SimpleDateFormat(DateFormat 的直接子类) 
  • (4)java.util.Calendar(抽象类) 
  • (5)java.util.GregorianCalendar(Calendar 的直接子类) 

2. java.util.Date 的构造函数和常用方法

java.util.Date 类的两个构造方法:
/**
 * 创建 Date 对象并用当前时间初始化此对象,以表示创建它的时间(精确到毫秒)
 * Allocates a <code>Date</code> object and initializes it so that
 * it represents the time at which it was allocated, measured to the
 * nearest millisecond.
 *
 * @see     java.lang.System#currentTimeMillis()
 */
public Date() {
    this(System.currentTimeMillis());
}

/**
 * 用于创建的Date日期类对象的日期时间被设置为从 1970年1月1日开始经过所传入的long型变量date毫秒数后的时刻
 * Allocates a <code>Date</code> object and initializes it to
 * represent the specified number of milliseconds since the
 * standard base time known as "the epoch", namely January 1,
 * 1970, 00:00:00 GMT.
 *
 * @param   date   the milliseconds since January 1, 1970, 00:00:00 GMT.
 * @see     java.lang.System#currentTimeMillis()
 */
public Date(long date) {
    fastTime = date;
}

java.util.Date 常用的方法:
public boolean after(Date anotherDate)    // 测试此日期是否在指定日期之后。 
public boolean before(Date anotherDate)    // 测试此日期是否在指定日期之前。 
public int compareTo(Date anotherDate)    // 比较两个日期的顺序。 
public long getTime()    // 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。 
public void setTime(long time)    // 以 long 类型参数 time 设置此 Date 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后指定毫秒的时间点。 

/*
    默认实现是把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy (Thu Aug 02 10:39:27 CST 2018)
    dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。 
    mon 是月份 (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)。 
    dd 是一月中的某一天(01 至 31),显示为两位十进制数。 
    hh 是一天中的小时(00 至 23),显示为两位十进制数。 
    mm 是小时中的分钟(00 至 59),显示为两位十进制数。 
    ss 是分钟中的秒数(00 至 61),显示为两位十进制数。 
    zzz 是时区(并可以反映夏令时)。标准时区缩写包括方法 parse 识别的时区缩写。如果不提供时区信息,则 zzz 为空,即根本不包括任何字符。 
    yyyy 是年份,显示为 4 位十进制数。
*/
public String toString()

 

3. 格式化时间的工具类

3.1 抽象类 java.text.DateFormat

DateFormat 的定义:public abstract class DateFormat extends Format {} 

注意:DateFormat 是一个抽象类。应该通过 DateFormat 的 getInstance(), getDateInstance()和 getDateTimeInstance() 获取DateFormat 实例(实际上是返回的 SimpleDateFormat 对象)。

DateFormat 的作用是格式化并解析“日期/时间”。实际上,它是 Date 的格式化工具,它能格式化 Date,进而将 Date 转换成我们想要的 String 字符串供使用。 
不过 DateFormat 的格式化 Date 的功能有限,没有 SimpleDateFormat 强大;但 DateFormat 是 SimpleDateFormat 的父类。

DateFormat 的作用是格式化 Date,帮助我们将 Date 转换成我们需要的 String 字符串。
它支持格 式化风格包括 FULL、LONG、MEDIUM 和 SHORT 共 4 种,具体名称为: 
/**
 * Constant for full style pattern.
 */
public static final int FULL = 0;
/**
 * Constant for long style pattern.
 */
public static final int LONG = 1;
/**
 * Constant for medium style pattern.
 */
public static final int MEDIUM = 2;
/**
 * Constant for short style pattern.
 */
public static final int SHORT = 3;
/**
 * Constant for default style pattern.  Its value is MEDIUM.
 */
public static final int DEFAULT = MEDIUM;
// DateFormat格式化的样例代码:
public static void main(String[] args) {

    Date now = new Date();
    /*
     * DateFormat.getDateInstance
     */
    // 输出日期字符串
    DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT);
    System.out.println(df1.format(now));   //18-8-2

    DateFormat df2 = DateFormat.getDateInstance(DateFormat.MEDIUM);
    System.out.println(df2.format(now));   //2018-8-2

    DateFormat df3 = DateFormat.getDateInstance(DateFormat.LONG);
    System.out.println(df3.format(now));    //2018年8月2日

    DateFormat df4 = DateFormat.getDateInstance(DateFormat.FULL);
    System.out.println(df4.format(now));   //2018年8月2日 星期四

    /*
     * DateFormat.getTimeInstance
     */
    // 输出时间字符串
    DateFormat df5 = DateFormat.getTimeInstance(DateFormat.SHORT);
    System.out.println(df5.format(now));   //上午11:04

    DateFormat df6 = DateFormat.getTimeInstance(DateFormat.MEDIUM);
    System.out.println(df6.format(now)); //11:04:37

    DateFormat df7 = DateFormat.getTimeInstance(DateFormat.LONG);
    System.out.println(df7.format(now));  //上午11时04分37秒

    DateFormat df8 = DateFormat.getTimeInstance(DateFormat.FULL);
    System.out.println(df8.format(now));  //上午11时04分37秒 CST
    
    
}


 

3.2 实现类 java.text.SimpleDateFormat

SimpleDateFormat的定义:public class SimpleDateFormat extends DateFormat {}

SimpleDateFormat 类是 DateFormat 的子类,可以按指定样式创建对象,可以自定义日期时间的格式。

日期和时间格式由日期和时间模式字符串指定。

定义了以下模式字母(所有其他字符 'A' 到 'Z' 和 'a' 到 'z' 都被保留)。

public static void main(String[] args) throws ParseException { 
	// 创建日期 
	Date date = new Date(); 
	// 创建不同的日期格式,将日期按照格式化输出
	DateFormat df1 = DateFormat.getInstance(); 
	System.out.println(df1.format(date));	// 18-8-2 下午12:40
	
	DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd");
	System.out.println(df2.format(date));	// 2018-08-02
	
	DateFormat df3 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EE"); 
	System.out.println(df3.format(date)); 	// 2018-08-02 12:40:22 星期四
	
	// 产生一个指定国家指定长度的日期格式,长度不同,显示的日期完整性也不同
	DateFormat df4 = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA);
	System.out.println(df4.format(date));	// 2018年8月2日 星期四
	
	DateFormat df5 = new SimpleDateFormat("yyyy 年 MM 月 dd 日 hh 时 mm 分 ss 秒 EE", Locale.CHINA); 
	System.out.println(df5.format(date));	// 2018 年 08 月 02 日 12 时 40 分 22 秒 星期四
	
	DateFormat df6 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EEEE", Locale.US); 
	System.out.println( df5.format(date));	// 2018-08-02 12:40:22 Thursday
	
	// 将符合该格式的字符串转换为日期,若格式不相配,则会出错
	Date date1 = df1.parse("18-08-2 下午 2:55");
	Date date2 = df2.parse("2018-08-02");
	Date date3 = df3.parse("2018-08-02 12:40:22 星期四");
	Date date4 = df4.parse("2018年8月2日 星期四");
	Date date5 = df5.parse("2018 年 08 月 02 日 02 时 55 分 47 秒 星期四");
	Date date6 = df6.parse("2018-08-02 02:55:47 Thursday");
	
	System.out.println("-------输出将字符串转换为日期的结果------");
	System.out.println(date1);
	System.out.println(date2);
	System.out.println(date3);
	System.out.println(date4);
	System.out.println(date5);
	System.out.println(date6);
}

4. java.util.Calendar 和 java.util.GregorianCalendar

从 JDK1.1 版本开始,在处理日期和时间时,系统推荐使用 Calendar 类进行实现。在设计上,Calendar 类的功能要比 Date 类强大很多,而且在实现方式上也比 Date 类要复杂一些,下面就介绍一下 Calendar 类的使用。 

Calendar 类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用 getInstance 方法创建即可。 

GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。其实 Calendar 的 getInstance 方法默认返回的就是一个 GregorianCalendar 实例。 

获取该类的对象,可以调用以下方法: 

  • Calendar ca = new GregorianCalendar()//默认当前的时刻。 
  • Calendar ca = new GregorianCanlendar(int year,int month,int dayOfMonth)//初始具有指定年月日 的公历类对象。
  • //  初始具有指定年月日的公历类对象。 
  • Calendar ca = new GregorianCanlendar(int year,int month,int dayOfMonth,int hourOfDay,int minute)
  • // 初始具有指定年月日的公历类对象。 
  • Calendar ca = new GregorianCanlendar(int year,int month,int dayOfMonth,int hourOfDay,int minute,int second)

上边的方法会使用默认的语言环境和时区对象。 
GregorianCalendar 中特有的重要方法: 

  • public boolean isLeapYear(int year) 
  • 确定给定的年份是否为闰年。如果给定的年份是闰年,则返回 true。 

这两个类也是在 java.util 包里面的,因为平时都是用 Date 类和 SimpleDateFormat 类,所以我没有深入了解,有兴趣的可以自行查看。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值