如何在本地主机和服务器上以毫秒为单位获取相同的当前时间值?
How to get same value for current time in milliseconds on localhost and server?
我创建了一个 Web 侦听器,其中包含一个 ScheduledExecutorService 到 运行 在特定日期和时间以及之后以固定时间间隔执行的作业。此调度程序会检查特定的日期和时间来完成这项工作。调度程序使用 UTC 时间。
问题是当我 运行 它在我的本地主机上时它工作得很好但是当我把它放在远程服务器上时(服务器和我的本地主机不在同一个时区)它无法正常工作(它们产生不同的System.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()
与时区无关。实际上,在这些服务器上同步时间的正确方法是让每个服务器使用 NTP(网络时间协议)与时间服务器同步。
这更像是一个系统管理问题,而不是 Java 编程问题。
我创建了一个 Web 侦听器,其中包含一个 ScheduledExecutorService 到 运行 在特定日期和时间以及之后以固定时间间隔执行的作业。此调度程序会检查特定的日期和时间来完成这项工作。调度程序使用 UTC 时间。
问题是当我 运行 它在我的本地主机上时它工作得很好但是当我把它放在远程服务器上时(服务器和我的本地主机不在同一个时区)它无法正常工作(它们产生不同的System.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()
与时区无关。实际上,在这些服务器上同步时间的正确方法是让每个服务器使用 NTP(网络时间协议)与时间服务器同步。
这更像是一个系统管理问题,而不是 Java 编程问题。