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