一、Date类及其常用API

  Java中的时间使用标准类库的Date类表示,是用距离一个固定时间点的毫秒数(可正可负,long类型)表达一个特定的时间点。固定的时间点叫纪元,是UTC时间的1970年1月1日00:00:00。UTC(Universal Time Coordinated世界调整时间)与GMT(Greenwich Mean Time格林威治时间)一样,是一种具有实际目的的科学标准时间。
  java.util.Date类封装日期及时间信息。
  

1.1、getTime()、setTime()

package day03;

import java.util.Date;

/**
 * java.util.Date其内部维护一个long值保存从1970年元旦到这一刻的毫秒值  
 * @author Administrator
 */
public class DateDemo {
    public static void main(String[] args){
        //创建出来的实例表示当前系统时间
        Date date = new Date();
        /*Date重写了toString()方法,用一个字符串来描述当前Date对象
        *所表示的时间。
        *Mon Feb 18 18:06:00 CST 2017
        */
        System.out.println(date);
        //获取1970年1月1日零时距此刻的毫秒数
        long time = date.getTime();
        time += 1000*60*60*24;
        System.out.println(time);
        //设置为距离此刻一天后的日期和时间
        date.setTime(time);
        System.out.println(date);

    }
}

二、SimpleDateFormat类

  java.text.SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类。它可以进行与日期相关的格式化(日期->文本)、解析(文本->日期)和规范化。

2.1、SimpleDateFormat()、format()

  构造方法SimpleDateFormat(String pattern)可以按照给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。
  日期模式匹配字符:
  y —— 年
  M —— 月
  d —— 日
  E —— 星期
  a —— AM或PM标识
  H —— 小时(24小时制)
  h —— 小时(12小时制)
  m —— 分钟
  s —— 秒

  final String format(Date date),该方法可以将Date格式化为String。

package day03;

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

/**
 * SimpleDateFormat可以根据一个特定的日期格式字符串将字符串与Date之间相互转换
 * @author Administrator
 *
 */
public class SimpleDateFormatDemo {
    public static void main(String[] args) {
        Date now = new Date();
        System.out.println(now);        
        //2014-08-21 11:07:22
        String format = "yyyy-MM-dd HH:mm:ss";
        SimpleDateFormat sdf = new SimpleDateFormat(format);        
        String str = sdf.format(now);
        System.out.println(str);    
    }
}

2.2、parse()

  和format方法相反,parse方法可按照特定格式将表示时间的字符串转换为Date对象。

package day03;

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

/**
 * 将字符串转换为Date
 * @author Administrator
 *
 */
public class SimpleDateFormatDemo2 {
    public static void main(String[] args) throws ParseException{
        String str = "2008年8月21日 23:44:21";
        String format = "yyyy年MM月dd日 HH:mm:ss";

        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date date = sdf.parse(str);
        System.out.println(date);

    }
}

三、Calendar类

  java.util.Calendar类用于封装日历信息,其主要作用在于其方法可以对时间分量进行运算。
  Calendar是抽象类,其具体子类针对不同国家的日历系统,其中应用最广泛的是GregorianCalendar(格里高里历,即通用的阳历),对应世界上绝大多数国家/地区使用的标准日历系统。

3.1、getInstance()、getTime()、setTime()

  Calendar提供了一个类方法getInstance,返回一个Calendar对象,其日历字段已由当前日期和时间初始化。
  Date getTime(),使用Date描述Calendar表示的日期并返回。
  void setTime(Date d),使Calendar表示Date所描述的日期。

package day03;

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

/**
 * java.util.Calendar
 * 日历类
 * 该类是一个抽象类,封装了对时间的相关操作。
 * 常用的实现类格里高里历(阳历)
 * 使用日历类是为了对时间进行相关的操作。比如计算时间。
 * @author xxx
 *
 */
public class CalendarDemo1 {
    public static void main(String[] args) {
        /*
         * 使用Calendar的静态方法创建实例,该方法会根据当前系统所在地区创建一个相应的实现,
         * 通常是GregorianCalendar。
         * 默认创建的日历实例表示当前系统时间。
         */
        Calendar calendar = Calendar.getInstance();

        /*
         *toString不能直观反映表示的日期 
         */
        System.out.println(calendar);

        /*
         *Calendar与Date之间的转换
         *Calendar -> Date
         *Date getTime()
         *Calendar提供了方法getTime(),该方法返回一个Date对象,
         *该对象表示的时间就是当前Calendar表示的时间。
         */
        Date date = calendar.getTime();
        System.out.println(date);

        //表示明天这一时刻
        date.setTime(date.getTime() + 1000 * 60 * 60 * 24);
        System.out.println(date);

        /*
         *Date -> Calendar
         *void setTime(Date date)
         *Calendar的setTime方法可以使用当前Calendar表示给定的Date所表示的时间。
         */
        //Calendar也表示明天这一刻了
        calendar.setTime(date);
    }
}

3.2、set()、get()

package day03;

import java.util.Calendar;

/**
 * Calendar提供了针对不同时间分量单独设置值的方法。
 * void set(int field,int value)
 * 其中第一个参数为:时间分量,例如:年,月,日等等。第二个参数为对应的值。
 * 时间分量是一个int值,使用Calendar提供的常量。
 */
public class CalendarDemo2 {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar.getTime());

        /*
         *设置Calendar,使其表示
         *2008-08-08 20:08:08
         */
        //设定年
        calendar.set(Calendar.YEAR,2008);
        System.out.println(calendar.getTime());

        /*
         * 设置月
         * 月从0开始,0表示1月。
         * 或者可以使用具体月的常量。
         */
        calendar.set(Calendar.MONTH, Calendar.AUGUST);
        //calendar.set(Calendar.MONTH, 7);

        /*
         * 设置日
         * 对应的时间分量常用的:
         * DATE:月中天
         * DAY_OF_MONTH:月中的天,与DATE一致
         * DAY_OF_WEEK:周中的天,星期几
         * DAY_OF_YEAR:年中的天
         */
        calendar.set(Calendar.DAY_OF_MONTH, 8);
        System.out.println(calendar.getTime());
        //时
        calendar.set(Calendar.HOUR_OF_DAY, 20);
        //分
        calendar.set(Calendar.MINUTE, 8);
        //秒
        calendar.set(Calendar.SECOND, 8);

        System.out.println(calendar.getTime());
    }
}
package day03;

import java.util.Calendar;

/**
 * 获取一个Calendar表示的日期中各个时间分量对应的值。
 * @author xxx
 *
 */
public class CalendarDemo3 {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        /*
         * int get(int field)
         * 获取对应时间分量的值
         */
        //获取年
        int year = calendar.get(Calendar.YEAR);
        //获取月
        int month = calendar.get(Calendar.MONTH) + 1;
        //获取日
        int day = calendar.get(Calendar.DATE);
        System.out.println(year+"-"+month+"-"+day);

        int hour = calendar.get(Calendar.HOUR_OF_DAY);

        int min = calendar.get(Calendar.MINUTE);

        int sec = calendar.get(Calendar.SECOND);
        System.out.println(hour+":"+min+":"+sec);

        //查看星期几?
        int dow = calendar.get(Calendar.DAY_OF_WEEK);
        System.out.println("周"+(dow==1?7:dow-1));
        String[] data = {"日","一","二","三","四","五","六"};
        System.out.println("周"+data[dow-1]);

        //到今天为止,今年已经多了多少天?
        int doy = calendar.get(Calendar.DAY_OF_YEAR);
        System.out.println(year+"已经过了"+doy+"天");
    }
}

3.3、getActualMaximum()

  int getActualMaximum(int field)给定此Calendar的时间值,返回指定日历字段可能拥有的最大值。

package day03;

import java.util.Calendar;

/**
 * 获取某一个时间分量所允许的最大值
 * @author xxx
 *
 */
public class CalendarDemo4 {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();

        //当月总共多少天?
        int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        System.out.println(days);

        //查看2016年2月多少天?
        calendar.set(Calendar.MONTH, 1);
        days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        System.out.println(days);

        //今年总共多少天?
        days = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
        System.out.println("今年共:"+days+"天");
    }
}

3.4、add()

  void add(int field,int mount)为给定的时间分量的值加上给定的值,若给定的值为负数则是减去给定的值。

package day03;

import java.util.Calendar;

/**
 * Calendar中计算时间的方法
 * void add(int field,int value)
 * 对指定的时间分量加上给定的值,若给定的值是负数,则是减去给定的值。
 * @author xxx
 *
 */
public class CalendarDemo5 {
    public static void main(String[] args) {
        /*
         * 查看3年2个月零8天以后的日期?
         */
        Calendar calendar = Calendar.getInstance();

        //查看3年后
        calendar.add(Calendar.YEAR, 3);
        System.out.println(calendar.getTime());

        //再查看2个月后
        calendar.add(Calendar.MONTH, 2);
        System.out.println(calendar.getTime());

        //再查看8天以后
        calendar.add(Calendar.DAY_OF_YEAR, 8);
        System.out.println(calendar.getTime());

        //再查看5小时以前
        calendar.add(Calendar.HOUR_OF_DAY, -5);
        System.out.println(calendar.getTime());
    }
}

四、关于时间的综合操作

  一般开发需求为要求用户输入一个日期,然后对该日期进行一系列的运算,再将计算后的日期显示给用户。则其解决流程如下:
1. 获取用户输入的日期字符串。
2. 使用SimpleDateFormat将其转换为Date。
3. 创建一个Calendar,使其表示Date表示的日期。
4. 使用Calendar根据需求计算时间。
5. 将Calendar转换为一个Date。
6. 使用SimpleDateFormat将Date转换为字符串后显示给用户。