Java基础关键_013_日期处理

发布于:2025-03-01 ⋅ 阅读:(90) ⋅ 点赞:(0)

目  录

一、传统 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)说明

  1. 获取自 1970年1月1日0时0分0秒到系统当前时间的总毫秒数;
  2. 1s (秒) = 1000ms(毫秒);
  3. 1ms(毫秒) = 1000μs(微秒);
  4. 1μs(微秒) = 1000ns(纳秒);
  5. 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)说明

  1. 需要使用 java.text.SimpleDateFormat 类,其父类是 DateFormat ;
  2. 日期和时间格式由日期和时间模式字符串指定,模式字母如下表所示。

模式字母

符号 日期或时间组件 说明 例子
G 年号 文本 AD
y 199696
Y 周 年 200909
M 一年中的月份(上下文相关) JulyJul07
L 一年中的月份 (独立形式) JulyJul07
w 一年中的周 27
W 每月的周 2
D 一年中的天 189
d 当月的日期 10
F 当月中的星期几 2
E 星期名称 文本 TuesdayTue
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 TimePSTGMT-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 2025

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String format = sdf.format(d1);
        System.out.println(format); // 2025年02月28日 14:29:31


        String 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开始,需要加1

        System.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-28
        System.out.println(LocalTime.now());    // 17:19:21.671997600
        System.out.println(LocalDateTime.now());    // 2025-02-28T17:19:21 .671997600

        System.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.122192700Z
        System.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.585827

        System.out.println(ldt.with(TemporalAdjusters.firstDayOfYear()));   // 2025-01-01T20:25:50.585827
        System.out.println(ldt.with(TemporalAdjusters.lastDayOfYear()));    // 2025-12-31T20:25:50.585827

        System.out.println(ldt.with(TemporalAdjusters.firstDayOfMonth()));  // 2025-02-01T20:25:50.585827
        System.out.println(ldt.with(TemporalAdjusters.lastDayOfMonth()));   // 2025-02-28T20:25:50.585827

        System.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:55

        LocalDateTime ldt1 = LocalDateTime.parse("2020年01月01日 08:08:08", dtf);
        System.out.println(ldt1);   // 2020-01-01T08:08:08
    }
}