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; } }