Java 日期时间 Date

Java 中的 java.util.Date 是一个用于处理日期和时间的类,它可以表示从 1970 年1月1日00:00:00到当前时间的毫秒数,并提供了一些常用的方法,用于日期和时间的操作。在本文中,我们将详细介绍 java.util.Date 的使用方法和注意事项。

Java 8 开始,Java 提供了新的时间处理类,LocalDate 和 LocalDateTime。

相关文章:Java 8 LocalDate 和 LocalDateTime 介绍

时间创建

直接使用 new Date() 就可以获取到当前时间,Date 内部维护了一个毫秒数值,记录的是从 1970 年1月1日00:00:00到当前时间的毫秒数。因此也可以直接使用毫秒数创建 Date 对象。

package com.wdbyte.date;

import java.util.Date;

/**
 * @author https://www.wdbyte.com
 */
public class JavaDateCreate {
    public static void main(String[] args) {
        Date date = new Date();
        // 输出时间
        System.out.println(date); // Tue Apr 25 20:28:23 CST 2023
        // 输出毫秒数
        System.out.println(date.getTime()); // 1682425703429

        // 当前毫秒数创建对象
        Date date2 = new Date(1682425703429L);
        System.out.println(date2); // Tue Apr 25 20:28:23 CST 2023
    }
}

从输出中发现时间的输出并不是我们常见的格式。

SimpleDateFormat 时间格式化

SimpleDateFormat 是Java中的一个类,用于将日期时间格式化为指定的字符串格式,或者将字符串格式化为日期对象

使用 SimpleDateFormat 可以指定日期和时间的格式,例如年月日、时分秒、时区等,并且可以使用各种模式字符来组合不同的日期和时间格式。

例如,以下代码将日期格式化为 年-月-日 时:分:秒格式:

package com.wdbyte.date;

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

/**
 * @author https://www.wdbyte.com
 */
public class JavaDateFormat {

    public static void main(String[] args) {
        Date date = new Date();
        // 时间格式化,yyyy 年份,MM 月份, dd 当月第多少天, hh:mm:ss 分别为时分秒
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String formatDate = simpleDateFormat.format(date);
        System.out.println(formatDate);
       // 输出:2023-04-25 08:31:02
    }
}

SimpleDateFormat 中的关键词可以任意组合,比如像下面这样:

SimpleDateFormat sdf1 = new SimpleDateFormat("当前日期是: yyyy-MM-dd");
SimpleDateFormat sdf2 = new SimpleDateFormat("当前时间是: hh:mm:ss");
System.out.println(sdf1.format(date));
System.out.println(sdf2.format(date));

这会输出:

当前日期是: 2023-04-25
当前时间是: 08:37:24

需要注意的是,SimpleDateFormat 并不是线程安全的,如果在多线程环境下使用,需要进行同步处理或使用 ThreadLocal 等方式来保证线程安全。或者使用 Java 8 中的新时间处理类。

相关文章:Java 8 LocalDate 和 LocalDateTime 介绍

字符串转时间

另外,SimpleDateFormat 还支持将字符串解析为日期对象,例如:

package com.wdbyte.date;

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

/**
 * @author https://www.wdbyte.com
 */
public class JavaDateFormat {

    public static void main(String[] args) throws ParseException {
        String strDate = "2023-01-19 10:30:00";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date myDate = sdf.parse(strDate);
        System.out.println(sdf.format(myDate));
        // 输出:2023-01-19 10:30:00
    }
}

日期比较

Date 中有 afterbefore 方法用来比较两个时间。

  • after :当前对象时间是否在指定 Date 对象时间之后。

  • before :当前对象时间是否在指定 Date 对象时间之前。

package com.wdbyte.date;

import java.util.Date;

/**
 * @author https://www.wdbyte.com
 */
public class JavaDateDiff {

    public static void main(String[] args) throws InterruptedException {
        // 获取当前时间
        Date date1 = new Date();
        // 休眠 3 秒
        Thread.sleep(3000);
        // 再获取一次当前时间
        Date date2 = new Date();

        // 很明显 date1 在 date2 之前,,所以 true
        boolean before = date1.before(date2);
        System.out.println(before); // true

        // 很明显 date2 在 date1 之后,所以 true
        boolean after = date2.after(date1);
        System.out.println(after); // true

        // date2 不在 date1 之前,所以 false
        System.out.println(date2.before(date1)); // false
    }
}

也可以时间 Date 维护的毫秒时间戳来比较,值越小,时间越早。

package com.wdbyte.date;

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

/**
 * @author https://www.wdbyte.com
 */
public class JavaDateDiff {

    public static void main(String[] args) throws InterruptedException {
        // 获取当前时间
        Date date1 = new Date();
        // 休眠 3 秒
        Thread.sleep(3000);
        // 再获取一次当前时间
        Date date2 = new Date();
      
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        System.out.println("date1:"+sdf.format(date1));
        System.out.println("date2:"+sdf.format(date2));
      
        Long diff = date1.getTime() - date2.getTime();
        if (diff > 0) {
            System.out.println("date1 > date2");
        }
        if (diff < 0) {
            System.out.println("date1 < date2");
        }
        if (diff == 0) {
            System.out.println("date1 = date2");
        }
    }
}

输出:date1 < date2

日期加减

日期的加减有两种方式,一种是直接转换成时间戳来进行加减,另一种是使用 Calendar 类来进行时间操作。

Calendar 操作

在Java中,可以使用Calendar类进行日期的加减操作。以下是一些示例代码:

package com.wdbyte.date;

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

/**
 * @author https://www.wdbyte.com
 */
public class JavaDateCalc {
    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date date = new Date();
        System.out.println(String.format("当前时间:%s", sdf.format(date)));
        date = new JavaDateCalc().addDay(date, 3);
        System.out.println(String.format("增加三天:%s", sdf.format(date)));
        date = new JavaDateCalc().minDay(date, 1);
        System.out.println(String.format("减去一天:%s", sdf.format(date)));
        date = new JavaDateCalc().addMonth(date, 2);
        System.out.println(String.format("增加两个月:%s", sdf.format(date)));
    }

    /**
     * 增加天数
     *
     * @param date
     * @param addDay
     * @return
     */
    public Date addDay(Date date, int addDay) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, addDay);
        Date newDate = cal.getTime();
        return newDate;
    }

    /**
     * 减少天数
     *
     * @param date
     * @param minDay
     * @return
     */
    public Date minDay(Date date, int minDay) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, -minDay);
        Date newDate = cal.getTime();
        return newDate;
    }

    /**
     * 增加月份
     *
     * @param date
     * @param addMonth
     * @return
     */
    public Date addMonth(Date date, int addMonth) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, addMonth);
        Date newDate = cal.getTime();
        return newDate;
    }
}

输出:

当前时间:2023-04-26 08:53:58
增加三天:2023-04-29 08:53:58
减去一天:2023-04-28 08:53:58
增加两个月:2023-06-28 08:53:58

时间戳操作

直接把时间转换成时间戳在进行增加或者减少时间。

package com.wdbyte.date;

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

/**
 * @author https://www.wdbyte.com
 */
public class JavaDateCalc2 {
    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date date = new Date();
        System.out.println(String.format("当前时间:%s", sdf.format(date)));
        // 三天的毫秒数:3 * 24 * 3600 * 1000
        date = new Date(date.getTime() + 3 * 24 * 3600 * 1000);
        System.out.println(String.format("增加三天:%s", sdf.format(date)));

        date = new Date(date.getTime() - 1 * 60 * 1000);
        System.out.println(String.format("减去一分钟:%s", sdf.format(date)));
    }
}

输出:

当前时间:2023-04-26 08:56:59
增加三天:2023-04-29 08:56:59
减去一分钟:2023-04-29 08:55:59

耗时统计

可以以时间毫秒时间戳来计算耗时。

示例:

public void exec() throws InterruptedException {
    long start = System.currentTimeMillis();
    // 做点什么
    Thread.sleep(3000);
    long end = System.currentTimeMillis();
    System.out.println("耗时:" + (end - start) + "ms");
}

输出:耗时:3003ms

最后还是要说一下,从 Java 8 开始,Java 提供了新的时间处理类,LocalDate 和 LocalDateTime。

相关文章:Java 8 LocalDate 和 LocalDateTime 介绍

一如既往,文章中代码存放在 Github.com/niumoo/javaNotes.