使用一个 long 类型的数字 来存储毫秒值
private transient long fastTime;
/**
* public Date() {
* this(System.currentTimeMillis()); // 调用下面的构造
* }
*
* public Date(long date) {
* this.fastTime = date;
* }
* 1、类 Date 表示特定的瞬间,精确到毫秒
*
* 2、Date 类 实例内部封装了 一个 存储毫秒值的 字段
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));
?
?
?
}
?
}
?
Date 类 不是最终类
Date 类的实例是可变的
多线程会不安全
设计不友好 无法快速获得指定年月日对应的 Date 的实例
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 类的实例是可变的
字段
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 );
}
?
}
?
子类
// 父类类型的 引用变量 指向了 子类类型的对象
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( year + "年" );