如何在本地主机和服务器上以毫秒为单位获取当前时间的相同值?
问题描述:
我已经创建了一个网络监听器,其中包含一个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();
}
答
其中一个或两个都必须是wron G。值System.currentTimeMillis()
是独立于时区的。真的,在这些服务器上同步时间的正确方法是使每个服务器使用NTP(网络时间协议)与时间服务器同步。
这比Java编程问题更像是一个系统管理问题。
+0
谢谢,这确实是一个系统管理问题。我所要做的就是在我的系统上安装ntp,并使用“ntpdate time.apple.com”与时间服务器同步。 – user2531123
但这是什么意思:***它没有正常工作***,我们如何帮助你对错误进行如此广泛的描述? –
我编辑了这个问题。主要问题是调度程序给出不同的System.currentTimeMillis()值,导致意外的结果。 – user2531123
System.currentTimeMillis()返回运行JVM的计算机的时间。你为什么要在这两个服务器中使用相同的值。什么是你的实际问题。 – Avinash