Java 日期

前言

1、日期类

  • 所有的数据类型,无论是整数,布尔,浮点数还是字符串,最后都需要以数字的形式表现出来。

  • Date 日期类型也不例外,换句话说,一个日期,比如 2019 年 10 月 1 日,在计算机里,会用一个数字来代替。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package java.util;

    /**
    * The class <code>Date</code> represents a specific instant
    * in time, with millisecond precision.
    *
    * @author James Gosling, Arthur van Hoff, Alan Liu
    * @see java.text.DateFormat, java.util.Calendar, java.util.TimeZone
    * @since JDK1.0
    */

    public class Date
    implements java.io.Serializable, Cloneable, Comparable<Date> {

    }
  • 最特殊的一个数字就是零。零这个数字,就代表 Java 中的时间原点,其对应的日期是 1970 年 1 月 1 日 0 点 0 分 0 秒 。

  • 为什么对应 1970 年呢?因为 1969 年发布了第一个 UNIX 版本:AT&T,综合考虑,当时就把 1970 年当做了时间原点。

  • 所有的日期,都是以这个 0 点为基准,每过一毫秒,就 +1。

    1
    2
    3
    4
    5
    6
    7
    import java.util.Date;

    Date d1 = new Date(); // 当前时间
    Date d2 = new Date(5000); // 从 1970 年 1 月 1 日 早上 8 点 0 分 0 秒 开始经历的毫秒数

    long intervals = d1.getTime(); // 获取日期的毫秒数
    long intervals = System.currentTimeMillis(); // 获取当前日期的毫秒数
  • 常用方法

关键字 介绍
getTime 得到一个 long 型的整数,这个整数代表从 1970.1.1 00:00:00:000 开始每经历一毫秒,增加 1
System.currentTimeMillis() 获取当前日期的毫秒数

2、日期格式化类

  • SimpleDateFormat 日期格式化类。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package java.text;

    /**
    * <code>SimpleDateFormat</code> is a concrete class for formatting and
    * parsing dates in a locale-sensitive manner. It allows for formatting
    * (date &rarr; text), parsing (text &rarr; date), and normalization.
    *
    * @author Mark Davis, Chen-Lieh Huang, Alan Liu
    * @see java.util.Calendar, java.util.TimeZone, DateFormat, DateFormatSymbols
    */

    public class SimpleDateFormat extends DateFormat {

    }
  • 常用方法

关键字 介绍
format 日期转字符串
parse 字符串转日期
  • SimpleDateFormat 模式(yyyy/MM/dd HH:mm:ss)需要和字符串格式保持一致,如果不一样就会抛出解析异常 ParseException

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    // y 代表年
    // M 代表月
    // d 代表日
    // H 代表 24 进制的小时
    // h 代表 12 进制的小时
    // m 代表分钟
    // s 代表秒
    // S 代表毫秒

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

    // 日期格式化
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" );
    Date d = new Date();

    // 日期转字符串
    String str = sdf.format(d);
    System.out.println("日期转字符串: " + str);

    // 字符串转日期
    try {
    Date dd = sdf.parse(str); // 字符串格式需要和 sdf 格式保持一致
    System.out.println("字符串转日期: " + dd);
    } catch (ParseException e) {
    e.printStackTrace();
    }

3、日历类

  • Calendar 日历类,常用于进行 “翻日历”,比如下个月的今天是多久。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package java.util;

    /**
    * The <code>Calendar</code> class is an abstract class that provides methods
    * for converting between a specific instant in time and a set of {@link
    * #fields calendar fields} such as <code>YEAR</code>, <code>MONTH</code>,
    * <code>DAY_OF_MONTH</code>, <code>HOUR</code>, and so on, and for
    * manipulating the calendar fields, such as getting the date of the next
    * week. An instant in time can be represented by a millisecond value that is
    * an offset from the <a name="Epoch"><em>Epoch</em></a>, January 1, 1970
    * 00:00:00.000 GMT (Gregorian).
    *
    * @author Mark Davis, David Goldsmith, Chen-Lieh Huang, Alan Liu
    * @see java.lang.System#currentTimeMillis(), Date, GregorianCalendar, TimeZone, java.text.DateFormat
    * @since JDK1.1
    */

    public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> {

    }
  • 常用方法

关键字 介绍
add 在原日期上增加 年/月/日
set 直接设置 年/月/日
getTime 获取日期对象
setTime 设置日期
  • 实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    import java.util.Calendar;
    import java.util.Date;

    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


    Calendar c = Calendar.getInstance(); // 获取日历对象
    Date now = c.getTime(); // 通过日历对象得到日期对象

    c.setTime(new Date(0)); // 把这个日历,调成日期: 1970.1.1 00:00:00

    // 当前日期
    c.setTime(now);
    System.out.println("当前日期:\t" + sdf.format(c.getTime()));

    // 下个月的今天
    c.setTime(now);
    c.add(Calendar.MONTH, 1);
    System.out.println("下个月的今天:\t" + sdf.format(c.getTime()));

    // 去年的今天
    c.setTime(now);
    c.add(Calendar.YEAR, -1);
    System.out.println("去年的今天:\t" + sdf.format(c.getTime()));

    // 上个月的第三天
    c.setTime(now);
    c.add(Calendar.MONTH, -1);
    c.set(Calendar.DATE, 3);
    System.out.println("上个月的第三天:\t" + sdf.format(c.getTime()));
文章目录
  1. 1. 前言
  2. 2. 1、日期类
  3. 3. 2、日期格式化类
  4. 4. 3、日历类
隐藏目录