java怎么設(shè)置每天固定時(shí)間

小億
177
2023-10-26 16:22:04

在Java中設(shè)置每天固定時(shí)間可以使用Java的定時(shí)任務(wù)工具類(lèi),如Timer和ScheduledExecutorService。

使用Timer類(lèi)可以在指定時(shí)間執(zhí)行某個(gè)任務(wù)。以下是一個(gè)示例代碼:

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class DailyTask {
    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)Timer實(shí)例
        Timer timer = new Timer();

        // 獲取當(dāng)前時(shí)間
        Calendar currentTime = Calendar.getInstance();
        currentTime.setTime(new Date());

        // 設(shè)置每天固定時(shí)間的小時(shí)和分鐘
        int hour = 9;
        int minute = 0;

        // 設(shè)置任務(wù)執(zhí)行時(shí)間
        Calendar scheduledTime = Calendar.getInstance();
        scheduledTime.set(Calendar.HOUR_OF_DAY, hour);
        scheduledTime.set(Calendar.MINUTE, minute);
        scheduledTime.set(Calendar.SECOND, 0);

        // 如果當(dāng)前時(shí)間已經(jīng)超過(guò)了設(shè)定的時(shí)間,則將執(zhí)行時(shí)間設(shè)置為明天的同一時(shí)間
        if (currentTime.after(scheduledTime)) {
            scheduledTime.add(Calendar.DATE, 1);
        }

        // 計(jì)算任務(wù)首次執(zhí)行的延遲時(shí)間
        long delay = scheduledTime.getTimeInMillis() - currentTime.getTimeInMillis();

        // 創(chuàng)建一個(gè)定時(shí)任務(wù)
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                // 在這里定義每天固定時(shí)間要執(zhí)行的任務(wù)
                System.out.println("任務(wù)執(zhí)行時(shí)間:" + new Date());
            }
        };

        // 啟動(dòng)定時(shí)任務(wù)
        timer.schedule(task, delay, 24 * 60 * 60 * 1000);
    }
}

使用ScheduledExecutorService類(lèi)也可以實(shí)現(xiàn)每天固定時(shí)間的任務(wù)調(diào)度。以下是一個(gè)示例代碼:

import java.time.LocalTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class DailyTask {
    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)ScheduledExecutorService實(shí)例
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

        // 設(shè)置每天固定時(shí)間的小時(shí)和分鐘
        int hour = 9;
        int minute = 0;

        // 獲取當(dāng)前時(shí)間
        LocalTime currentTime = LocalTime.now();

        // 計(jì)算任務(wù)首次執(zhí)行的延遲時(shí)間
        long initialDelay = LocalTime.of(hour, minute).toSecondOfDay() - currentTime.toSecondOfDay();
        if (initialDelay < 0) {
            initialDelay += 24 * 60 * 60; // 添加一天的秒數(shù)
        }

        // 創(chuàng)建一個(gè)定時(shí)任務(wù)
        Runnable task = () -> {
            // 在這里定義每天固定時(shí)間要執(zhí)行的任務(wù)
            System.out.println("任務(wù)執(zhí)行時(shí)間:" + LocalTime.now());
        };

        // 啟動(dòng)定時(shí)任務(wù)
        scheduler.scheduleAtFixedRate(task, initialDelay, 24 * 60 * 60, TimeUnit.SECONDS);
    }
}

上述代碼中,使用LocalTime類(lèi)來(lái)表示時(shí)間,計(jì)算任務(wù)首次執(zhí)行的延遲時(shí)間,以及在任務(wù)中獲取當(dāng)前時(shí)間。使用ScheduledExecutorService的scheduleAtFixedRate方法來(lái)啟動(dòng)定時(shí)任務(wù),并指定任務(wù)的首次執(zhí)行延遲時(shí)間和執(zhí)行周期。

0