目 录
一、传统 API
1.System.currentTimeMillis()
(1)说明
(2)实例
2.构造方法
(1)说明
(2)无参构造
(3)有参构造
3.日期格式化
(1)说明
(2)实例
4.日历
(1)get() 与 getTime()
(2)set() 与 setTime()
二、全新 API
1.LocalDate、LocalTime、LocalDateTime
2.toEpochMilli 新时间戳
3.Duration 时间差
4.Period 日期差
5.TemporalAdjusters 时间矫正器
6.DateTimeFormatter 日期格式化
一、传统 API
1.System.currentTimeMillis()
(1)说明
- 获取自 1970年1月1日0时0分0秒到系统当前时间的总毫秒数;
- 1s (秒) = 1000ms(毫秒);
- 1ms(毫秒) = 1000μs(微秒);
- 1μs(微秒) = 1000ns(纳秒);
- 1ns (纳秒)= 1000ps(皮秒)。
(2)实例
public class DateTest {public static void main(String[] args) {long time = System.currentTimeMillis();System.out.println(time); // 1740723807436}
}
2.构造方法
(1)说明
此处是 java.util.Date ,而 java.sql.Date 是 java.util.Date 的子类。
(2)无参构造
public class DateTest {public static void main(String[] args) {// 获取当前时间Date d1 = new Date();System.out.println(d1); // Fri Feb 28 13:56:29 CST 2025}
}
(3)有参构造
public class DateTest {public static void main(String[] args) {// 获取当前时间Date d1 = new Date(System.currentTimeMillis());System.out.println(d1); // Fri Feb 28 14:02:24 CST 2025// 获取指定时间Date d2 = new Date(3000);System.out.println(d2); // Thu Jan 01 08:00:03 CST 1970}
}
3.日期格式化
(1)说明
- 需要使用 java.text.SimpleDateFormat 类,其父类是 DateFormat ;
- 日期和时间格式由日期和时间模式字符串指定,模式字母如下表所示。
符号 | 日期或时间组件 | 说明 | 例子 |
---|---|---|---|
G | 年号 | 文本 | AD |
y | 年 | 年 | 1996 ; 96 |
Y | 周 年 | 年 | 2009 ; 09 |
M | 一年中的月份(上下文相关) | 月 | July ; Jul ; 07 |
L | 一年中的月份 (独立形式) | 月 | July ; Jul ; 07 |
w | 一年中的周 | 数 | 27 |
W | 每月的周 | 数 | 2 |
D | 一年中的天 | 数 | 189 |
d | 当月的日期 | 数 | 10 |
F | 当月中的星期几 | 数 | 2 |
E | 星期名称 | 文本 | Tuesday ; Tue |
u | 星期数 (1 = 星期一,...,7 = 星期日) | 数 | 1 |
a | 上午/下午标记 | 文本 | PM |
H | 一天中的小时 (0-23) | 数 | 0 |
k | 一天中的小时 (1-24) | 数 | 24 |
K | 上午 / 下午 (0-11) 小时数 | 数 | 0 |
h | 上午 / 下午 (1-12) | 数 | 12 |
m | 分钟(小时) | 数 | 30 |
s | 秒(分钟) | 数 | 55 |
S | 毫秒 | 数 | 978 |
z | 时区 | 通用时区 | Pacific Standard Time ; PST ; GMT-08:00 |
Z | 时区 | RFC 822 时区 | -0800 |
X | 时区 | ISO 8601 时区 | -08 ; -0800 ; -08:00 |
(2)实例
public class DateTest {public static void main(String[] args) throws ParseException {Date d1 = new Date();System.out.println(d1); // Fri Feb 28 14:29:31 CST 2025SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String format = sdf.format(d1);System.out.println(format); // 2025年02月28日 14:29:31String time = "2000年06月16日 08:08:08";Date d2 = sdf.parse(time);System.out.println(d2); // Fri Jun 16 08:08:08 CST 2000}
}
4.日历
(1)get() 与 getTime()
public class DateTest {public static void main(String[] args) {Calendar calendar = Calendar.getInstance(); // 获取当前时间的日历对象,调用一个静态方法System.out.println(calendar.getTime()); // 获取当前时间System.out.println(calendar.get(Calendar.YEAR)); // 获取年份System.out.println(calendar.get(Calendar.MONTH) + 1); // 获取月份,从0开始,需要加1System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); // 获取本月的第几天System.out.println(calendar.get(Calendar.DAY_OF_WEEK)); // 获取星期,从1开始,1表示星期天System.out.println(calendar.get(Calendar.DAY_OF_YEAR)); // 获取本年的第几天System.out.println(calendar.get(Calendar.HOUR)); // 获取小时,12小时制System.out.println(calendar.get(Calendar.HOUR_OF_DAY)); // 获取小时,24小时制System.out.println(calendar.get(Calendar.MINUTE)); // 获取分钟System.out.println(calendar.get(Calendar.SECOND)); // 获取秒System.out.println(calendar.get(Calendar.MILLISECOND)); // 获取毫秒}
}
(2)set() 与 setTime()
public class DateTest {public static void main(String[] args) throws ParseException {/*** set()*/Calendar calendar = Calendar.getInstance(); // 获取当前时间的日历对象calendar.set(Calendar.YEAR, 1945);calendar.set(Calendar.MONTH, Calendar.SEPTEMBER);calendar.set(Calendar.DAY_OF_MONTH, 15);System.out.println("日本无条件投降:" + calendar.get(Calendar.YEAR) + "年" + calendar.get(Calendar.MONTH) + "月" + calendar.get(Calendar.DAY_OF_MONTH) + "日"); // 日本无条件投降:1945年8月15日calendar.set(2020, Calendar.JANUARY, 1, 8, 8, 8);System.out.println(calendar.getTime()); // Wed Jan 01 08:08:08 CST 2020/*** setTime()*/String time = "2022-02-24";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(time);calendar.setTime(date);System.out.println(calendar.getTime()); // Thu Feb 24 00:00:00 CST 2022}
}
二、全新 API
由于传统 API 存在线程安全问题,jdk 8 提供了一套全新 API ,在 java.time 包下。
1.LocalDate、LocalTime、LocalDateTime
public class DateTest {public static void main(String[] args) throws ParseException {System.out.println("【获取系统当前日期时间】");System.out.println(LocalDate.now()); // 2025-02-28System.out.println(LocalTime.now()); // 17:19:21.671997600System.out.println(LocalDateTime.now()); // 2025-02-28T17:19:21 .671997600System.out.println("==================================");System.out.println("【获取指定日期时间】");System.out.println(LocalDate.of(2000, 1, 1));System.out.println(LocalTime.of(8, 16, 26, 36));System.out.println("==================================");System.out.println("【加日期时间】");System.out.println(LocalDateTime.now().plusYears(3).plusMonths(3).plusDays(1));System.out.println("==================================");System.out.println("【减日期时间】");System.out.println(LocalDateTime.now().minusYears(3).minusMonths(3).minusDays(1));}
}
2.toEpochMilli 新时间戳
public class DateTest {public static void main(String[] args) throws ParseException {// UTC 时间戳Instant now = Instant.now();System.out.println(now); // 2025-02-28T10:38:03.122192700ZSystem.out.println("时间戳:" + now.toEpochMilli()); // 时间戳:1740739083122}
}
3.Duration 时间差
public class DateTest {public static void main(String[] args) throws ParseException {LocalDateTime ldt1 = LocalDateTime.of(2019, 12, 12, 0, 0, 0);LocalDateTime ldt2 = LocalDateTime.now();Duration between = Duration.between(ldt1, ldt2);System.out.println("距离新冠肺炎爆发已经:" + between.toDays() + "天"); // 距离新冠肺炎爆发已经:1905天System.out.println("距离新冠肺炎爆发已经:" + between.toHours() + "小时"); // 距离新冠肺炎爆发已经:45738小时System.out.println("距离新冠肺炎爆发已经:" + between.toMinutes() + "分钟"); // 距离新冠肺炎爆发已经:2744326分钟System.out.println("距离新冠肺炎爆发已经:" + between.toMillis() + "毫秒"); // 距离新冠肺炎爆发已经:164659582897毫秒}
}
4.Period 日期差
public class DateTest {public static void main(String[] args) throws ParseException {LocalDate ld1 = LocalDate.of(2019, 12, 12);LocalDate ld2 = LocalDate.now();Period between = Period.between(ld1, ld2);System.out.println("距离新冠病毒爆发已经过去:" + between.getYears() + "年" + between.getMonths() + "月" + between.getDays() + "天"); // 距离新冠病毒爆发已经过去:5年2月16天}
}
5.TemporalAdjusters 时间矫正器
public class DateTest {public static void main(String[] args) throws ParseException {LocalDateTime ldt = LocalDateTime.now();System.out.println(ldt); // 2025-02-28T20:25:50.585827System.out.println(ldt.with(TemporalAdjusters.firstDayOfYear())); // 2025-01-01T20:25:50.585827System.out.println(ldt.with(TemporalAdjusters.lastDayOfYear())); // 2025-12-31T20:25:50.585827System.out.println(ldt.with(TemporalAdjusters.firstDayOfMonth())); // 2025-02-01T20:25:50.585827System.out.println(ldt.with(TemporalAdjusters.lastDayOfMonth())); // 2025-02-28T20:25:50.585827System.out.println(ldt.with(TemporalAdjusters.next(DayOfWeek.MONDAY))); // 2025-03-03T20:25:50.585827}
}
6.DateTimeFormatter 日期格式化
public class DateTest {public static void main(String[] args) throws ParseException {LocalDateTime ldt = LocalDateTime.now();DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");System.out.println(dtf.format(ldt)); // 2025年02月28日 20:33:55LocalDateTime ldt1 = LocalDateTime.parse("2020年01月01日 08:08:08", dtf);System.out.println(ldt1); // 2020-01-01T08:08:08}
}