我已經創建了一個網絡監聽器,其中包含一個ScheduledExecutorService以在特定日期和時間以及之後以固定的固定時間間隔運行作業。該調度程序檢查具體的日期和時間來完成這項工作。調度程序使用UTC時間。如何在本地主機和服務器上以毫秒爲單位獲取當前時間的相同值?
問題是,當我在我的本地它完美運行,但是當我把它放在遠程服務器上(服務器和我的本地主機不在同一個時區),它不能正常工作(他們生產系統的不同價值。的currentTimeMillis()。隨着記錄器的幫助下,我已經檢查的System.currentTimeMillis的(價值)無論在本地主機和服務器,它們是不同的。
這是我的計劃。
private static ScheduledExecutorService execService = Executors.newScheduledThreadPool(1, namedThreadFactory);
final Calendar date = new GregorianCalendar();
date.setTimeZone(TimeZone.getTimeZone("UTC"));
execService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
logger.info("Scheduler ran");
try {
if (date.get(Calendar.DAY_OF_MONTH) == 1) {
if (!(System.currentTimeMillis() - getStartTime().getTime() > 300000)) {
logger.info("Doing the job");
myJob();
}
else{
logger.info("Too late after scheduled time");
}
} else {
logger.info("Current Day of Month: " + date.get(Calendar.DAY_OF_MONTH) + ". Job will be done on 1st Day of the month");
}
} catch (Exception ex) {
logger.info(ex);
}
}
}, getInitialDelay(), (2*60000), TimeUnit.MILLISECONDS);
}
private static long getOffsetTime() {
Calendar dateForOffset = new GregorianCalendar();
dateForOffset.setTimeZone(TimeZone.getTimeZone("UTC"));
int days = dateForOffset.getActualMaximum(Calendar.DAY_OF_MONTH);
switch (days) {
case 31:
offsetTimeInMilli = PERIOD;
break;
case 29:
offsetTimeInMilli = (-1) * PERIOD;
break;
case 28:
offsetTimeInMilli = (-2) * PERIOD;
break;
default:
break;
}
return offsetTimeInMilli;
}
private static long getInitialDelay() {
long currentTime = System.currentTimeMillis();
logger.info("Current Time " + currentTime);
logger.info("Set Time to do the job -->" + getStartTime().getTime() + " Milliseconds");
initialDelay = getStartTime().getTime() - currentTime;
logger.info("Initial Delay Found : " + initialDelay + " Milliseconds");
return initialDelay;
}
private static Date getStartTime() {
Calendar d10am = Calendar.getInstance();
d10am.setTimeZone(TimeZone.getTimeZone("UTC"));
//logger.info("Day of Month ----- >" + d10am.get(Calendar.DAY_OF_MONTH));
//d10am.set(Calendar.DAY_OF_MONTH, 1);
d10am.set(Calendar.HOUR_OF_DAY, 5);
d10am.set(Calendar.MINUTE, 55);
d10am.set(Calendar.SECOND, 0);
d10am.set(Calendar.MILLISECOND, 0);
d10am.get(Calendar.DAY_OF_MONTH);
//logger.info("Day of Month ----- >" + Calendar.DAY_OF_MONTH);
return d10am.getTime();
}
但這是什麼意思:***它沒有正常工作***,我們如何幫助你對錯誤進行如此廣泛的描述? –
我編輯了這個問題。主要問題是調度程序給出不同的System.currentTimeMillis()值,導致意外的結果。 – user2531123
System.currentTimeMillis()返回運行JVM的計算機的時間。你爲什麼要在這兩個服務器中使用相同的值。什麼是你的實際問題。 – Avinash