如何在本地主机和服务器上以毫秒为单位获取当前时间的相同值?

问题描述:

我已经创建了一个网络监听器,其中包含一个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

其中一个或两个都必须是wron G。值System.currentTimeMillis()是独立于时区的。真的,在这些服务器上同步时间的正确方法是使每个服务器使用NTP(网络时间协议)与时间服务器同步。

这比Java编程问题更像是一个系统管理问题。

+0

谢谢,这确实是一个系统管理问题。我所要做的就是在我的系统上安装ntp,并使用“ntpdate time.apple.com”与时间服务器同步。 – user2531123