0

我已經創建了一個網絡監聽器,其中包含一個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(); 
     } 
+1

但這是什麼意思:***它沒有正常工作***,我們如何幫助你對錯誤進行如此廣泛的描述? –

+0

我編輯了這個問題。主要問題是調度程序給出不同的System.currentTimeMillis()值,導致意外的結果。 – user2531123

+0

System.currentTimeMillis()返回運行JVM的計算機的時間。你爲什麼要在這兩個服務器中使用相同的值。什麼是你的實際問題。 – Avinash

回答

3

其中一個或兩個都必須是wron G。值System.currentTimeMillis()是獨立於時區的。真的,在這些服務器上同步時間的正確方法是使每個服務器使用NTP(網絡時間協議)與時間服務器同步。

這比Java編程問題更像是一個系統管理問題。

+0

謝謝,這確實是一個系統管理問題。我所要做的就是在我的系統上安裝ntp,並使用「ntpdate time.apple.com」與時間服務器同步。 – user2531123

相關問題