Java 日期时间 Date
Java 中的 java.util.Date
是一个用于处理日期和时间的类,它可以表示从 1970 年1月1日00:00:00到当前时间的毫秒数,并提供了一些常用的方法,用于日期和时间的操作。在本文中,我们将详细介绍 java.util.Date
的使用方法和注意事项。
Java 8 开始,Java 提供了新的时间处理类,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 中的新时间处理类。
字符串转时间
另外,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 中有 after
和 before
方法用来比较两个时间。
-
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。
一如既往,文章中代码存放在 Github.com/niumoo/javaNotes.