在 Java 中涉及日期和时间的相关类以及它们之间的转换
1、java.util.Date 类
1.1、字段 ( Field )
使用一个 long 类型的数字 来存储毫秒值
private transient long fastTime;
1.2、构造
/**
* public Date() {
* this(System.currentTimeMillis()); // 调用下面的构造
* }
*
* public Date(long date) {
* this.fastTime = date;
* }
* 1、类 Date 表示特定的瞬间,精确到毫秒
*
* 2、Date 类 实例内部封装了 一个 存储毫秒值的 字段
1.3、方法
package datatime;
import java.util.Date;
/**
* 比较两个 Date 实例是否相等 public boolean equals ( Object o )
* boolean before / after ( Date when ) 判断 早晚
*
* 大约每一两年出现会产生闰秒
*
* */
public class DateTest2 {
public static void main(String[] args) {
long millis = System.currentTimeMillis();
Date now = new Date(millis);
System.out.println(now);
long day = 1000L * 24 * 60 * 60; // 一天的毫秒值
Date first = new Date(millis - day);
System.out.println(first);
Date second = new Date(millis);
System.out.println(second);
Date third = new Date(millis + day);
System.out.println(third);
System.out.println("~~~~~~~~~~~");
// equals 是被重写过的 比较两个 Date 实例是否相等
System.out.println(first.equals(now));
System.out.println(second.equals(now));
System.out.println(third.equals(now));
System.out.println("~~~~~~~~~~~");
System.out.println(first.before(now));
System.out.println(second.before(now));
System.out.println(third.before(now));
System.out.println("~~~~~~~~~~~");
System.out.println(first.after(now));
System.out.println(second.after(now));
System.out.println(third.after(now));
}
}
1.4、Date 存在的缺陷
-
Date 类 不是最终类
-
Date 类的实例是可变的
-
多线程会不安全
-
设计不友好 无法快速获得指定年月日对应的 Date 的实例
2、java.util.Calendar 类
2.1、概述:
The Calendar class is an abstract class that provides methods for converting between a specific instant in time and a set of calendar fields such as YEAR, MONTH, DAY_OF_MONTH, HOUR, and so on,
优点:
-
相对于 Date 类来说设计上较友好
缺点:
-
线程不安全
-
Calendar 类的实例是可变的
2.2、字段( Filed )
字段
-
public static final int YEAR;
----
类方法
-
public static Calendar getInstance()
-
public static Calendar getInstance( TimeZone timeZone , Locale locale )
package datatime;
import java.util.Calendar;
import java.util.GregorianCalendar;
/**
* 1、java.util.Calendar 类是个抽象类
* 2、java.util.GregorianCalendar 类是 Calendar 的子类
* 3、Calendar 为特定瞬间与一组日历字段之间的转换提供了一些方法,并为操作日历字段提供了一些方法
* 日历字段 ( calendar field ) 就是表示 特定瞬间 中某个部分的 字段 ,比如:
* Calendar.YEAR 表示年 、
* Calendar.MONTH 表示月、
* Calendar.DATE 表示天 、
* Calendar.HOUR 表示小时 ( 12 小时进制 ,分上午和下午 ) 、
* Calendar.HOUR_OF_DAY 表示小时 ( 24 小时进制 ) 、
* Calendar.MINUTE 表示分钟 、
* Calendar.SECOND 表示秒 、
* Calendar.MILLISECOND 表示毫秒
* 4、瞬间 可用毫秒值来表示,它是距历元的偏移量
* 历元: 即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历
* 5、通过 Calendar 实例 调用 get( int) 方法可以获得指定 日历字段 的值
*/
public class CalendarTest1 {
public static void main(String[] args) {
// 父类类型的 引用变量 指向了 子类类型的对象
Calendar calendar = new GregorianCalendar(); // 默认地区 、默认时区
System.out.println( calendar );
StringBuilder builder = new StringBuilder();
int year = calendar.get( Calendar.YEAR );
builder.append( year + "年" );
// 鬼子那边的月份是从 零 开始计数的
int month = calendar.get( Calendar.MONTH ) + 1 ;
builder.append( month + "月" );
int date = calendar.get( Calendar.DATE );
builder.append( date + "日" );
int hours = calendar.get( Calendar.HOUR_OF_DAY );
builder.append( hours + ":" );
int minutes = calendar.get( Calendar.MINUTE );
builder.append( minutes + ":" );
int seconds = calendar.get( Calendar.SECOND );
builder.append( seconds + "." );
int millis = calendar.get( Calendar.MILLISECOND );
builder.append( millis );
String s = builder.toString();
System.out.println( s );
}
}
2.3、子类 GregorianCalenda
子类
// 父类类型的 引用变量 指向了 子类类型的对象
Calendar calendar = new GregorianCalendar(); // 默认地区 、默认时区
将时间转化为 Calendar 对象实例 ( 注意calendar.clear() 方法用来清空字段 )
package datatime;
import java.util.Calendar;
/**
* 1、通过 静态工厂方法 来获取 Calendar 类的实例
* ( 这里的 静态工厂方法 就是 Calendar 类中的 返回 Calendar实例 的 类方法 )
* 2、设置 Calendar 实例所表示的 瞬间 :
* public void set( int field , int value ) 为 指定的日历字段 设置 指定的值,比如 c.set( Calendar.YEAR , 1999 )
* public final void set( int year , int month , int date )
* public final void set( int year , int month , int date , int hourOfDay , int minute )
* public final void set( int year , int month , int date , int hourOfDay , int minute , int second )
*/
public class CalendarTest2 {
public static void main(String[] args) {
String s ;
// 父类类型的 引用变量 指向了 子类类型的对象
Calendar calendar = Calendar.getInstance(); // 默认地区 、 默认时区
System.out.println( calendar );
System.out.println( calendar.getClass() ); // 运行时类型
// 在 同一个类中使用 本类声明的 类方法时可以省略类名
s = toString( calendar ) ; // s = CalendarTest2.toString( calendar ) ;
System.out.println( s );
/*
calendar.set( Calendar.YEAR , 1999 );
calendar.set( Calendar.MONTH , 5 ); // 注意: 鬼子那边月份从零开始计数
calendar.set( Calendar.DATE , 10 );
calendar.set( Calendar.HOUR_OF_DAY , 7 );
calendar.set( Calendar.MINUTE , 50 );
calendar.set( Calendar.SECOND , 0);
calendar.set( Calendar.MILLISECOND , 0 );
*/
calendar.set( 1999 , 5 , 10, 7, 50 , 0 );
calendar.set( Calendar.MILLISECOND , 0 );
System.out.println( calendar );
s = toString( calendar ) ;
System.out.println( s );
}
public static String toString( Calendar calendar ) {
StringBuilder builder = new StringBuilder();
int year = calendar.get( Calendar.YEAR );
builder.append(
