Java 编程中我们经常需要对时间日期转换成字符串,或将字符串转换面时间日期类型,以及时间运算。本文主要介绍Java 时间转换,计算时间戳,倒计时的分类、小时或天数计算的工具类。

1、Date 常用方法

java.util.Date 是 Java 中表示日期和时间的一个基础类。但随着时间的推移,许多其方法被标记为过时,并被推荐在 Java 8 引入的 java.time 包中的新类替代。但是,Date 仍然在很多旧的代码库中广泛使用,并在与某些库和框架的交互中仍然很重要。

常用方法如下,

方法名及参数

描述

Date()

分配一个 Date 对象,并初始化它以表示它被分配的时间,

精确到毫秒。

Date(long date)

分配一个

Date

对象,表示自 1970 年 1 月 1 日 00:00:00 GMT 

以来的指定毫秒数。

getTime()

返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此

Date

对象表示的时间(以毫秒为单位)。

setTime(long time)

设置此

Date

对象,以表示自 1970 年 1 月 1 日 00:00:00 GMT 

以来的时间(以毫秒为单位)。

toString()

将此 Date 对象转换为字符串:

dow mon dd hh:mm:ss zzz yyyy。

dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。

mon 是月份。

dd 是月中的某一天,两位数。

hh 是小时 (00 至 23)。

mm 是分钟。

ss 是秒。

zzz 是时间区域(并不总是显示)。

yyyy 是年份。

compareTo(Date anotherDate)

比较两个日期的顺序。返回值:

0(相等)、负整数

(此日期在 anotherDate 之前)、正整数

(此日期在 anotherDate 之后)。

before(Date when)

测试此日期是否在指定日期之前。

返回 true,如果此 Date 对象在

when

参数之前。

after(Date when)

测试此日期是否在指定日期之后。

返回 true,如果此 Date 对象在 when 参数之后。

注意:尽管 java.util.Date 有更多的方法,但许多已被标记为过时,并被推荐使用 java.time 包中的类替代。如正在开发新的代码或者在维护旧代码,建议查阅官方文档以确保使用了正确和最新的方法。

2、SimpleDateFormat 常用方法

SimpleDateFormat 是 Java 中 java.text 包下的一个类,用于日期和时间的格式化和解析。常用方法如下,

方法名及参数

描述

SimpleDateFormat(String pattern)

使用给定的模式和默认的日期格式符号构造

SimpleDateFormat

SimpleDateFormat(String pattern, Locale locale)

使用给定的模式和日期格式符号构造

SimpleDateFormat

format(Date date)

将一个

Date

格式化为日期/时间字符串。

parse(String source)

将给定的字符串解析为日期。

setTimeZone(TimeZone zone)

设置时区。

toPattern()

返回此

SimpleDateFormat

实例的模式字符串。

applyPattern(String pattern)

使用新的模式字符串应用到日期和时间格式符号。

setLenient(boolean lenient)

指定日期/时间解析是否应该是宽松的。

isLenient()

查询此

SimpleDateFormat

是否为解析进行宽松解析。

getCalendar()

获取此

SimpleDateFormat

使用的日历,如

GregorianCalendar

setCalendar(Calendar newCalendar)

设置此

SimpleDateFormat

使用的日历。

getNumberFormat()

返回数字格式化对象,

该对象被用于格式化和解析此日期格式的字段值。

3、日期转换运算工具类

可以在线运行查看效果,工具类代码如下,

import java.lang.ref.SoftReference;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;



public final class DateUtils {

public static void main(String[] args) {
    //剩余天数
    System.out.println("现在距 2050-11-29 11:30:20 剩余天数: "+DateUtils.remainingDays(DateUtils.parse("2050-11-29 11:30:20")));
     //剩余小时数
    System.out.println("现在距 2050-11-29 11:30:20 剩余小时数: "+DateUtils.remainingHours(DateUtils.parse("2050-11-29 11:30:20")));
    //剩余分钟数
    System.out.println("现在距 2050-11-29 11:30:20 剩余分钟数: "+DateUtils.minutesRemaining(DateUtils.parse("2050-11-29 11:30:20")));
      //剩余天数
    System.out.println("现在距 2050-11-29 剩余天数: "+DateUtils.remainingDays(DateUtils.parseDay("2050-11-29")));
     //剩余小时数
    System.out.println("现在距 2050-11-29 剩余小时数: "+DateUtils.remainingHours(DateUtils.parseDay("2050-11-29")));
    //剩余分钟数
    System.out.println("现在距 2050-11-29 剩余分钟数: "+DateUtils.minutesRemaining(DateUtils.parseDay("2050-11-29")));
    System.out.println("当前时间时间戳:"+DateUtils.toEpochSecond());
    System.exit(0); //success
  }
    static final class DateFormatHolder {
        private static final ThreadLocal<SoftReference<Map<String, SimpleDateFormat>>> THREADLOCAL_FORMATS = new ThreadLocal<SoftReference<Map<String, SimpleDateFormat>>>();

        DateFormatHolder() {
        }

        public static SimpleDateFormat formatFor(String pattern) {
            SoftReference<Map<String, SimpleDateFormat>> ref = THREADLOCAL_FORMATS.get();
            Map<String, SimpleDateFormat> formats = ref == null ? null : ref.get();
            if (formats == null) {
                formats = new HashMap<String, SimpleDateFormat>();
                THREADLOCAL_FORMATS.set(new SoftReference(formats));
            }

            SimpleDateFormat format = formats.get(pattern);

            if (format == null) {
                format = new SimpleDateFormat(pattern);
                format.setTimeZone(TimeZone.getTimeZone("GMT+8"));
                ((Map) formats).put(pattern, format);
            }

            return format;
        }

        public static void clearThreadLocal() {
            THREADLOCAL_FORMATS.remove();
        }
    }

    public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    public static final String YYYY_MM_DD_T_HH_MM_SS_SSSXXX = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
    public static final String YYYY_MM_DD_T_HH_MM_SS_XX = "yyyy-MM-dd'T'HH:mm:ssXXX";
    public static final String YYYY_MM_DD = "yyyy-MM-dd";
    public static final String YYYYMMDD = "yyyyMMdd";
    public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
    public static final String MMDD = "MMdd";
    public static final String YYYYMM = "yyyyMM";
    public static final String YYYY_MM = "yyyy-MM";

    //将时间类型转换为指定pattern格式字符串
    public static String formatDate(Date date, String pattern) {
        SimpleDateFormat formatFor = DateFormatHolder.formatFor(pattern);
        return formatFor.format(date);
    }
    //将字符串按pattern格式转换为Date类型
    public static Date parseDate(String date, String pattern) {
        SimpleDateFormat formatFor = DateFormatHolder.formatFor(pattern);
        try {
            return formatFor.parse(date);
        }
        catch (ParseException e) {
            System.out.println(e);
        }
        return null;
    }

    public static Date parse(String date) {
        return parseDate(date, YYYY_MM_DD_HH_MM_SS);
    }

    public static String format(Date date) {
        return formatDate(date, YYYY_MM_DD_HH_MM_SS);
    }

    public static Date parseDay(String date) {
        return parseDate(date, YYYY_MM_DD);
    }

    public static String formatDay(Date date) {
        return formatDate(date, YYYY_MM_DD);
    }

    /**
     * 剩余分钟数
     *
     * @param date 结束点日期
     * @return 分钟数
     */
    public static long minutesRemaining(Date date) {
        return (date.getTime() / 1000 / 60 - DateUtils.toEpochSecond() / 60);
    }

    /**
     * 剩余小时
     *
     * @param date 结束点日期
     * @return 小时数
     */
    public static long remainingHours(Date date) {
        return minutesRemaining(date) / 60;
    }

    /**
     * 剩余天数
     *
     * @param date 结束点日期
     * @return 天数
     */
    public static long remainingDays(Date date) {
        return remainingHours(date) / 24;
    }

    /**
     * 将此日期时间转换为从epoch开始的秒数
     *
     * @return epoch开始的秒数
     */
    public static long toEpochSecond() {
        return System.currentTimeMillis() / 1000;
    }


}

推荐文档