在 Java 8 之前,操作日期类的有两个:java.util.Date
、java.util.Calendar
;在 Java 8 之后,又推出了一个全新的日期类 java.time.LocalDate
。接下来,简单地介绍下如何使用它们吧
讲 java.util.Date 类之前,咱们先说说另外一个类的方法吧,System.currentTimeMillis()
:返回当前时间与格林威治时间 1970-01-01 00:00:00 (北京时间:1970-01-01 08:00:00)之间以毫秒为单位的时间差。此方法适用于计算时间差
// 1626624005531 时间戳
Long time = System.currentTimeMillis();
System.currentTimeMillis()
方法的返回类型是 Long 类型。一般用于获取某个方法或其它的执行时间差。即:在开始前获取一次,在结束时获取一次,结束时间减去开始时间,得到执行时间。如:
public class DateTest {
public void test() {
System.out.println("======test======");
}
public static void main(String[] args) {
DateTest dateTest = new DateTest();
Long startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
dateTest.test();
}
Long endTime = System.currentTimeMillis();
Long result = endTime - startTime;
// 55 毫秒
System.out.println(result);
}
}
在上述代码中,for 循环调用了 DateTest#test() 方法 10000 次,耗时 55 毫秒。
时间戳与 java.util.Date 类互相转换:
// Date 类型转换为时间戳
Date date = new Date();
Long time = date.getTime();
// 时间戳转换为 Date 类型
Long long = 1626624005531L;
Date nowTime = new Date(long);
一般 java.util.Date 类与 java.text.SimpleDateFormat 类一起用,用于格式化日期。
如:将日期转换为特定格式的字符串:
public class DateTest {
public static void main(String[] args) {
String timePattern = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat format = new SimpleDateFormat(timePattern);
String s = format.format(new Date());
System.out.println(s);
}
}
将字符串转换为日期:
public static void main(String[] args) {
String timePattern = "yyyy-MM-dd HH:mm:ss";
String timeOne = "2021-07-18 22:53:22";
SimpleDateFormat format = new SimpleDateFormat(timePattern);
try {
Date nowDate = format.parse(timeOne);
System.out.println(nowDate);
} catch (ParseException e) {
System.out.println("日期格式化错误!!,日期为:" + timeOne);
}
}
java.sql.Date
是 java.util.Date 类的子类;是针对 SQL 语句使用的,它只包含日期而没有时间部分,一般在读写数据库的时候用,PreparedStament#setDate()
方法的参数和 ResultSet#getDate()
方法的都是 java.sql.Date
。
如何用 java.sql.Date 获取当前时间?
public class DateTest {
public static void main(String[] args) {
java.sql.Date date = new java.sql.Date(System.currentTimeMillis());
// 2021-07-19
System.out.println(date);
}
}
java.util.Date 与 java.sql.Date 互相转换:
public class DateTest {
public static void main(String[] args) {
Date date = new Date();
java.sql.Date dat = new java.sql.Date(date.getTime());
}
}
java.util.Calendar:日历类,是个抽象类
Calendar 实例化的方法:
其实这两种方法是一样的:
public class CalendarTest {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
// class java.util.GregorianCalendar
System.out.println(calendar.getClass());
}
}
常用的方法:
field 取值有:
注意:
get()
方法
public static void main(String[] args) {
// 获取到的是当前时间
Calendar calendar = Calendar.getInstance();
int i = calendar.get(Calendar.DAY_OF_MONTH);
// 18,表示是这个月的第 18 天(今天是 2021-07-18)
System.out.println(i);
}
set(int field, int value)
方法
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, 23);
// 23。将当前时间设置成某个时间,即“2021-07-23”
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
}
add(int field, int value)
方法
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
// 给当前时间加上 5 天
calendar.add(Calendar.DAY_OF_MONTH, 5);
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
}
那么,我想在当前时间加上 2 个月呢?
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
// 给当前时间加上 5 天
calendar.add(Calendar.MONTH, 2);
System.out.println(calendar.get(Calendar.MONTH));
}
然后,再减去 3 天呢?
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
// 给当前时间加上 5 天
calendar.add(Calendar.MONTH, 2);
// 减去 3 天
calendar.add(Calendar.DAY_OF_MONTH, -3);
System.out.println(calendar.get(Calendar.MONTH));
}
getTime()
方法
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, -3);
Date time = calendar.getTime();
// 获取 3 天前的日期
System.out.println(time);
}
setTime(Date date)
方法
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
// 获取 3 天前的日期
calendar.add(Calendar.DAY_OF_MONTH, -3);
Date nowTime = new Date();
// 又获取到当前时间
calendar.setTime(nowTime);
}