9.5 时间和日期

Java关于时间和日期的类,主要有Date和Calendar。Caldendar将逐渐取代Date,Date的大部分方法,已经是depreciate,意思就是不推荐,将来JDK升级后将不可用。Calendar主要有以下的方法:
返回类型函数名及参数说明示例
Calendar
getInstance()
静态方法,生成一个Calendar对象。Calendar没有公开的构造方法
Calendar c = Calendar.getInstance();
int
get(int field)
根据field取得年月日时分秒的某一个值。field值是Calendar的属性,主要有以下几个:
Calendar.YEAR代表年,
Calendar.MONTH代表月,
Calendar.DATE代表日期,
Calendar.HOUR代表小时
Calendar.MINUTE代表分
Calendar.SECOND代表秒
Calendar.MILLISECOND代表毫秒
Calendar.DAY代表星期
int year = c.get(Calendar.YEAR);
System.out.println(year);
int month = c.get(Calendar.MONTH);
System.out.println(month);
int date = c.get(Calendar.DATE);
System.out.println(date);
int day = c.get(Calendar.DAY_OF_WEEK);
System.out.println(day);
int hour = c.get(Calendar.HOUR);
System.out.println(hour);
hour = c.get(Calendar.HOUR_OF_DAY);
System.out.println(hour);
int minite = c.get(Calendar.MINUTE);
System.out.println(minite);
int second = c.get(Calendar.SECOND);
System.out.println(second);
int milisecond=c.get(Calendar.MILLISECOND);
System.out.println(milisecond);
void
set(field, value);
根据field设置年月日时分秒的某一个值为valuec.set(Calendar.DATE, 29);
void
set(year, month, date, hourOfDay, minute,second);   
一次设定年月日时分秒
c.set(2019, 5, 10, 10, 38,20);
void
set(year, month, date);   
一次设定年月日
c.set(2019, 5, 10);
void
add(field, amount);
根据field增加量,例如31日的日期加上两天,那么月份也会自动增加当前日期往后10天c.add(Calendar.DATE, 10);
当前日期往前5天
c.add(Calendar.DATE, -5);

long
getTimeInMillis()
从1970年到当前的毫秒数,这会是一个很大的整数。通常用来做时间戳,因为肯定不会重复。
long t=c.getTimeInMillis();
void
setTime(Date date)
根据一个Date对象设置Calendar
c.setTime(date);
Date
getTime()
生成一个Date对象
Date d=c.getTime();
下面这段代码包含了上面大部分的方法,以下代码需要import语句,Date和Calendar都是java.util里的包,特别注意,java.sql里面也有一个Date类,不要搞错了
import java.util.Calendar;
import java.util.Date;
public class Test{
    public static void main(String args[]){
        Calendar c=Calendar.getInstance();
        Date d=new Date(c.getTimeInMillis());
        System.out.println(d);
        //取得当前的年份
        int year=c.get(Calendar.YEAR);
        System.out.println(year);
        //取得当前的月份
        int month=c.get(Calendar.MONTH);
        System.out.println(month);
        //取得当前的日期
        int date=c.get(Calendar.DATE);
        System.out.println(date);
        //取得当前的星期
        int day=c.get(Calendar.DAY_OF_WEEK);
        System.out.println(day);
        //取得当前的小时
        int hour=c.get(Calendar.HOUR);
        System.out.println(hour);
        //取得当前的小时,24小时
        hour=c.get(Calendar.HOUR_OF_DAY);
        System.out.println(hour);
        //取得当前的分钟
        int minite=c.get(Calendar.MINUTE);
        System.out.println(minite);
        //取得当前的秒
        int second=c.get(Calendar.SECOND);
        System.out.println(second);
        //取得当前的毫秒
        int milisecond=c.get(Calendar.MILLISECOND);
        System.out.println(milisecond);
        //当前日期时间下加10天,自动增加月份、年份
        c.add(Calendar.DATE,10);
        System.out.println(c.getTime());
        //当前日期时间下减5天,自动减少月份、年份
        c.add(Calendar.DATE,-5);
        System.out.println(c.getTime());
    }
}
我们可以通过Calendar类取得当前的所有时间因子,如果要按某个格式打印出来的话,恐怕比较难统一,例如中国人喜欢年月日的格式,有的国家用日月年,或者月日年这样的格式,为了方便打印日期,专门有一个类来处理。它就是SimpleDateFormat,这个类位于java.text包内,例如看下面的代码:
public static void main(String args[]){
    java.text.SimpleDateFormat dateFormat=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
    String time=dateFormat.format(new java.util.Date());
    System.out.println(time);
}
这段代码运行的结果就是当前时间的”年月日时分秒 毫秒“的格式。
dateFormat是一个SimpleDateFormat对象,它通过构造函数初始化,就确定了是什么格式。 "yyyy-MM-dd HH:mm:ss SSS"就是格式,yyyy代表四个字符的年份,MM代表两个字符月份,dd代表两个字符的日期,HH代表小时,mm代表分钟,ss代表秒,SSS代表毫秒,因为毫秒是1000以内的所以需要三位。
你可以根据需要格式化一个日期,然后打印。 要注意,你不能随意更改字母的数量,例如年份写成yy,那么就是年份的后两位,如果是yyy,那么可能就是没有意义的一个格式,那么就会使用默认的4位表达年份。 调用的format函数,就是把日期(在这里是一个new Date(),这个Date对象表示当前时间)格式化成字符串。