一、java.util.Date

java.util.Date 这个日期类,它的对象表示一个特定的瞬间,精确到毫秒
本质上也是表示的是一个时间,标准纪元是从 1970.01.01 这天0 点开始到某一个时刻的毫秒数。类型是long

import java.util.Date;
public class TestDate {

    public static void main(String[] args) {

        Date date = new Date();
        System.out.println(date);
        //Sun Jun 03 12:38:28 CST 2018

    }
}

1.1 部分源码

public class Date
    implements java.io.Serializable, Cloneable, Comparable<Date>
{
   private transient long fastTime;
  /**
   * 构造器
   */
   public Date() {
        this(System.currentTimeMillis());//调用下面的构造方法
    }

 /**
   * 构造器,传入一个long类型的参数; 将传入的时间变化成为指定的时间规范
   */ 
   public Date(long date) {
        fastTime = date;
    }

 /**
  * 比较两个时间:方法
  */
  public boolean before(Date when) {
        return getMillisOf(this) < getMillisOf(when);
    }

   public boolean after(Date when) {
       return getMillisOf(this) > getMillisOf(when);
   }

 /**
  *  重写equals 方法
  */
  public boolean equals(Object obj) {
       return obj instanceof Date && getTime() == ((Date) obj).getTime();
   }


 /**
  *  转化为毫秒
  */
  public long getTime() {
      return getTimeImpl();
  }

  private final long getTimeImpl() {
      if (cdate != null && !cdate.isNormalized()) {
          normalize();
      }
      return fastTime;
  }


}

1.2 API

这个类大量的 setter 和 getter 方法都已经过时了。只有少量的方法可以使用。


二、DateFormat和SimpleDateFormat_时间和字符串的互相转换

java中的日期型变量赋值 java 日期函数_System


2.1 API

方法

描述

String format(Date date)

将一个 Date 格式化为日期/时间字符串。

Date parse(String source)

从给定字符串的开始解析文本,以生成一个日期。

java.text.DateFormat中两个API


2.2 应用案例

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

public class TestSimpleDateFormat {

    public static void main(String[] args) {

        //1. 将日期转化为特定格式的字符串
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date();
        String strDate = format.format(date);
        System.out.println(strDate); //2018-06-03 13:14:21


        //2. 将特定格式的字符串转化为日期

        String strDate1 = "2018年06月03日  13时14分21秒"; //注意格式需要匹配
        DateFormat format1 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
        try {
            Date date1 = format1.parse(strDate1);
            System.out.println(date1);//Sun Jun 03 13:14:21 CST 2018
        } catch (ParseException e) {
            e.printStackTrace();
        }

    }
}

三、Calendar和GregorianCalendar

java中的日期型变量赋值 java 日期函数_字符串_02


Calendar 的很多属性都静态变量,可以通过类名直接访问,就不需要对象了。Calendar. MONTH

使用这个类来替代Date中很多过时的方法。


3.1 Date、String、Calendar类型之间的转化

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

public class TestCalendar {

    public static void main(String[] args) {
        calendarToString();
        stringToCalendar();
        dateToString();
        stringToDate();
        dateToCalendar();
        calendarToDate();
    }

    private static void calendarToDate() {
        //6.Calendar转化Date
        Calendar calendar = Calendar.getInstance();
        Date date =calendar.getTime();
    }

    private static void dateToCalendar() {
        //5.Date 转化Calendar
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
    }

    private static void stringToDate() {
        // 4.String 转化Date 
        String str="2018-6-3";
        SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date birthday = sdf.parse(str);
            System.out.println(birthday);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    private static void dateToString() {
        //3.Date 转化String
        SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
        String dateStr=sdf.format(new Date());
        System.out.println(dateStr);
    }

    private static void stringToCalendar() {
        // 2.String 转化Calendar
        String str="2018-06-03";
        SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = sdf.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        System.out.println(calendar.getTime());
    }

    private static void calendarToString() {
        //1.Calendar 转化 String 
        //获取当前时间的具体情况,如年,月,日,week,date,分,秒等 
        Calendar calendar = Calendar.getInstance(); //获取实例
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String dateStr = sdf.format(calendar.getTime());
        System.out.println(dateStr);
    }
}

四、其他

java.lang.Date 中诸多方法已经过时,多使用Calendar 中的静态属性替代。

例如:

int getYear()
已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.YEAR) - 1900 取代。


int year =  Calendar.getInstance().get(Calendar.YEAR);//  获得当前年份

参考

  1. 可以参考文档(不推荐) java 日期与字符串之间的转换
  2. 深入理解Java:SimpleDateFormat安全的时间格式化
  3. 高琪三百集视频