Java で現在時刻を取得する方法: LocalDateTime、Date、Calendar、および 3 つの比較


序文


開発中、現在時刻を取得したり、時刻を処理 (特定の時刻に基づいて増減) する必要がよくあります。Java で時刻を取得するには、LocalDateTime、Date、Calendar など、さまざまな方法があります。LocalDateTime は新機能です。 java8 の場合、他の 2 つと比較して、LocalDateTime には多くの利点があり、最も推奨される方法でもあります。
最初に LocalDateTime の使用法を紹介し、次に Date と Calendar の使用法を紹介し、最後にそれらの違いを比較しましょう。

1.ローカル日付時刻

JDK1.8 バージョンで新しく導入された API は時間の管理を強化し、特に便利な時間計算メソッドを多数備えており、スレッドセーフです。

1.1 現在時刻を取得する LocalDate.now()

    @Test
    void test() {
    
    
        LocalDate localDate = LocalDate.now();
        LocalTime localTime = LocalTime.now();
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println("localDate:"+localDate);//2023-02-22
        System.out.println("localTime:"+localTime);//17:25:36.590
        System.out.println("localDateTime:"+localDateTime);//2023-02-22T17:25:36.590
    }

出力結果:
ここに画像の説明を挿入
形式変換を行わずに可読性の高い日付形式が得られていることがわかります。
注: ISO 8601 で指定されている日付と時刻の区切り文字は T です。標準形式は次のとおりです。

日期:yyyy-MM-dd
时间:HH:mm:ss
带毫秒的时间:HH:mm:ss.SSS
日期和时间:yyyy-MM-dd'T'HH:mm:ss
带毫秒的日期和时间:yyyy-MM-dd'T'HH:mm:ss.SSS

1.2 現在時刻の年、月、日、時、分、秒を取得します localDateTime.get Year()...

    @Test
    void test() {
    
    
        LocalDateTime localDateTime = LocalDateTime.now(); // 获取当前时间
        int year = localDateTime.getYear(); // 获取年份 2023
        int month = localDateTime.getMonthValue(); // 获取月份 2
        int day = localDateTime.getDayOfMonth(); // 获取月中的天数 22
        int hour = localDateTime.getHour(); // 获取当前的小时 17
        int minute = localDateTime.getMinute(); // 获取当前分钟 33
        int second = localDateTime.getSecond(); // 获取当前秒数 22
        System.out.println(year);
        System.out.println(month);
        System.out.println(day);
        System.out.println(hour);
        System.out.println(minute);
        System.out.println(second);
    }

出力結果:
ここに画像の説明を挿入

1.3 LocalDateTime を LocalDateTime.of() に代入する

    void test() {
    
    
        LocalDateTime of = LocalDateTime.of(2023,2,22,22,22,22);
        System.out.println(of); // 输出2023-02-22T22:22:22
    }

出力結果:
ここに画像の説明を挿入

1.4 時刻と文字列の変換 LocalDateTime.parse()

    @Test
    void test() {
    
    
        // 将字符串转换为指定格式的时间(格式要和给定的格式一致,不然会报错)
        LocalDateTime parse = LocalDateTime.parse("2023-02-22 22:22:22", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        LocalDateTime parse1 = LocalDateTime.parse("2023 02 22 22:22:22", DateTimeFormatter.ofPattern("yyyy MM dd HH:mm:ss"));
        LocalDateTime parse2 = LocalDateTime.parse("2023.02.22 22:22:22", DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss"));
        System.out.println(parse); // 输出2023-02-22T22:22:22
        System.out.println(parse1); // 输出2023-02-22T22:22:22
        System.out.println(parse2); // 输出2023-02-22T22:22:22
        // 时间转字符串
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter of = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String dateTime = now.format(of);
        System.out.println(dateTime); // 输出 2023-02-22 17:56:18
    }

出力結果:
ここに画像の説明を挿入

1.5 時間操作 - 対応する時間を加算 LocalDateTime.now().plusyears(2)

LocalDateTime は、日付と時刻を加算および減算するための非常に単純なチェーン呼び出しを提供し、時間の計算を非常に簡単にします。

    @Test
    void test() {
    
    
        LocalDateTime now = LocalDateTime.now(); // 当前时间2023-02-22T18:00:19.352
        LocalDateTime plusYears= now.plusYears(2); // 在当前时间加上2年2025-02-22T18:00:19.352
        LocalDateTime plusMonths= now.plusMonths(2);// 在当前时间商加上2月2023-04-22T18:00:19.352
        LocalDateTime plusDays= now.plusDays(2); // 在当前时间加上2天2023-02-24T18:00:19.352
        LocalDateTime plusHours= now.plusHours(2); // 在当前时间加上2个小时2023-02-22T20:00:19.352
        LocalDateTime plusMinutes= now.plusMinutes(30); // 在当前时间加上30分钟2023-02-22T18:30:19.352
        LocalDateTime plusSeconds = now.plusSeconds(30); // 在当前时间加上30秒2023-02-22T18:00:49.352
        System.out.println(now);
        System.out.println(plusYears);
        System.out.println(plusMonths);
        System.out.println(plusDays);
        System.out.println(plusHours);
        System.out.println(plusMinutes);
        System.out.println(plusSeconds);
    }

出力結果:
ここに画像の説明を挿入

1.6 時間の計算 - 対応する時間を減算します LocalDateTime.now().minusyears(2)

    @Test
    void test() {
    
    
        LocalDateTime now = LocalDateTime.now(); // 当前时间
        LocalDateTime minusYears = now.minusYears(2); // 在当前时间减上2年
        LocalDateTime minusMonths = now.minusMonths(2);// 在当前时间商减上2月
        LocalDateTime minusDays = now.minusDays(2); // 在当前时间减上2天
        LocalDateTime minusHours = now.minusHours(2); // 在当前时间减上2个小时
        LocalDateTime minusMinutes = now.minusMinutes(30); // 在当前时间减上30分钟
        LocalDateTime minusSeconds = now.minusSeconds(30); // 在当前时间减上30秒
        System.out.println("now:" + now);
        System.out.println("minusYears:" + minusYears);
        System.out.println("minusMonths:" + minusMonths);
        System.out.println("minusDays:" + minusDays);
        System.out.println("minusHours:" + minusHours);
        System.out.println("minusMinutes:" + minusMinutes);
        System.out.println("minusSeconds:" + minusSeconds);
    }

出力結果:
ここに画像の説明を挿入

1.7 2 つの時間の比較 LocalDateTime.now().compareTo()

    @Test
    void test() {
    
    
        LocalDateTime now = LocalDateTime.now(); // 当前时间
        LocalDateTime now1 = now.plusYears(5); // 在当前时间加上5年
        //  给LocalDateTime 赋值
        LocalDateTime of = LocalDateTime.of(2023,2,2,22,22,22);
        LocalDateTime of1 = LocalDateTime.of(2023,8,5,1,1,1);
        //两个时间作比较,第一个时间减去第二个时间(如果年份相同,比较月份,月份相同比较天数,以此类推)
        int compareTo = now1.compareTo(now);
        int compareTo1 = now.compareTo(now1);
        int compareTo2 = now.compareTo(of);
        int compareTo3 = now.compareTo(of1);
        System.out.println(now);   // 输出 2023-02-22T20:19:44.112v
        System.out.println(now1); // 输出 2028-02-22T20:19:44.112
        System.out.println(of); // 输出 2023-02-02T22:22:22
        System.out.println(of1); // 输出 2023-08-05T01:01:01
        System.out.println(compareTo); // 输出 5
        System.out.println(compareTo1); // 输出 -5
        System.out.println(compareTo2); // 输出 20
        System.out.println(compareTo3); // 输出 -6
    }

出力結果:

1.8 時差を計算するには、Duration を使用します。Duration.between(of,now).toMillis()

なお、差分の年と秒の値は計算されませんが、計算する秒数はミリ秒を計算することで変換できます。

    @Test
    void test() {
    
    
        LocalDateTime now = LocalDateTime.now(); // 当前时间
        //  给LocalDateTime 赋值
        LocalDateTime of = LocalDateTime.of(2022,2,22,2,2,2);
        Duration duration = Duration.between(of,now); // 后面减去前面
        long toDays = Duration.between(of,now).toDays(); //相差的天数
        long toHours = Duration.between(of,now).toHours();//相差的小时数
        long toMinutes = Duration.between(of,now).toMinutes();//相差的分钟数
        long toMillis = Duration.between(of,now).toMillis();//相差毫秒数
        long toNanos = Duration.between(of,now).toNanos();//相差的纳秒数
        System.out.println("toDays:"+ toDays); // 输出 toDays:365
        System.out.println("toHours:"+ toHours); // 输出 toHours:8778
        System.out.println("toMinutes:"+ toMinutes); // 输出 toMinutes:526732
        System.out.println("toMillis:"+ toMillis); // 输出 toMillis:31603973840
        System.out.println("toNanos:"+ toNanos); // 输出 toNanos:31603973840000000
    }

出力結果:
ここに画像の説明を挿入

1.9 現在時刻の年、月、日、時、分、秒を変更する LocalDateTime.now().with Year(2060)

    @Test
    void test() {
    
    
        LocalDateTime now = LocalDateTime.now(); // 当前时间
        LocalDateTime withYear = now.withYear(2060); // 改变当前年份(变成2060年)
        LocalDateTime withMonth = now.withMonth(12); // 改变当前月份(变成12月份)
        LocalDateTime withDayOfMonth = now.withDayOfMonth(28); //改变当前天数(变成28日)
        LocalDateTime withHour = now.withHour(23); // 改变当前小时数(变成23时)
        LocalDateTime withMinute = now.withMinute(30); // 改变当前分钟(变成30分钟)
        LocalDateTime withSecond = now.withSecond(23); // 改变当前小时数(变成23时)
        LocalDateTime withDayOfYear = now.withDayOfYear(60); // 从一月一号开始加上60天
        System.out.println(now);
        System.out.println("withYear:"+ withYear);
        System.out.println("withMonth:"+ withMonth);
        System.out.println("withDayOfMonth:"+ withDayOfMonth);
        System.out.println("withHour:"+ withHour);
        System.out.println("withMinute:"+ withMinute);
        System.out.println("withSecond:"+ withSecond);
        System.out.println("withDayOfYear:"+ withDayOfYear);
    }

出力結果:
ここに画像の説明を挿入

1.10 カスタム出力形式 DateTimeFormatter.ofPattern(“yyyy/MM/dd HH:mm:ss”);

    @Test
    void test() {
    
    
        // 自定义格式化:
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss");
        System.out.println("自定义格式yyyy/MM/dd HH:mm:ss :"+dtf.format(LocalDateTime.now()));
        System.out.println("自定义格式yyyy.MM.dd HH:mm:ss :"+dtf1.format(LocalDateTime.now()));

        // 用自定义格式解析:
        LocalDateTime dt2 = LocalDateTime.parse("2020/10/20 15:16:17", dtf);
        System.out.println("格式解析:"+dt2);
    }

出力結果:
ここに画像の説明を挿入

1.11 LocalDateTime の with() メソッド

// 本月第一天0:00时刻:
LocalDateTime firstDay = LocalDate.now().withDayOfMonth(1).atStartOfDay();
// 本月最后1天:
LocalDate lastDay = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
// 下月第1天:
LocalDate nextMonthFirstDay = LocalDate.now().with(TemporalAdjusters.firstDayOfNextMonth());
// 本月第1个周一:
LocalDate firstWeekday = LocalDate.now().with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));

出力結果:

1.12 2つの日付の前後の比較と判定 LocalDateTime.now().isBefore()

    @Test
    void test() {
    
    
        //判断两个时间点的前后
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime target = LocalDateTime.of(2022, 2, 22, 22, 22, 22);
        boolean isBefore = now.isBefore(target);
        System.out.println("now:"+now);
        System.out.println("target:"+target);
        System.out.println("isBefore:"+isBefore);
        System.out.println(LocalDate.now().isBefore(LocalDate.of(2022, 2, 22)));
        System.out.println(LocalTime.now().isAfter(LocalTime.parse("08:15:00")));
    }
    }

出力結果:
ここに画像の説明を挿入

2. Util は現在時刻を取得します

2.1 日付

2.1.1 現在時刻を取得する日付

    @Test
    void test() {
    
    
        Date date = new Date(); // 返回当前时间戳格式
        SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 改变格式
        System.out.println(dateFormat.format(date)); // 获取当前时间  2023-02-22 21:24:53
    }

2.1.1 日付の欠陥

書式を設定しないと、印刷された日付が読みにくくなります。

    @Test
    void test() {
    
    
        Date date = new Date(); // 返回当前时间戳格式
        System.out.println(date); // 获取当前时间  Wed Feb 22 21:34:18 CST 2023
    }

通常、SimpleDateFormate は書式設定の実装に使用されますが、sdf の最大の問題はスレッドセーフではないことです。

2.2 カレンダー

    @Test
    void test() {
    
    
        Calendar cal= Calendar.getInstance(); // 返回当前时间戳格式
        SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 改变格式
        System.out.println(dateFormat.format(cal.getTime())); // 获取当前时间
        int y=cal.get(Calendar.YEAR); // 获取当前年份
        int m=cal.get(Calendar.MONTH); // 获取当前月份
        int d=cal.get(Calendar.DATE); // 获取当前日期
        int h=cal.get(Calendar.HOUR_OF_DAY); // 获取当前小时
        int mi=cal.get(Calendar.MINUTE); // 获取当前分钟
        int s=cal.get(Calendar.SECOND); // 获取当前秒数
        System.out.println("现在时刻是"+y+"年"+m+"月"+d+"日"+h+"时"+mi+"分"+s+"秒");
    }

三、System.currentTimeMillis()

SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z"); // 改变格式
Date date = new Date(System.currentTimeMillis()); // 返回当前时间戳格式
System.out.println(formatter.format(date)); // 获取当前时间


要約する

LocalDateTime は時刻の取得や計算に非常に便利で、スレッドセーフなので使いやすいです。

おすすめ

転載: blog.csdn.net/sunzixiao/article/details/129166030