我正在使用代理Java应用程序,它安装在世界各地的几台Windows机器上。 我想定期同步窗口时钟(date和时间)。 我已经find了本地命令设置时间在Windows中的Java代码:
Runtime.getRuntime().exec("cmd /C date " + strDateToSet); // dd-MM-yy Runtime.getRuntime().exec("cmd /C time " + strTimeToSet); // hh:mm:ss
或执行
Runtime.getRuntime().exec("cmd /C date " + strDateToSet + "& time " + strTimeToSet);
但是主要的问题是集中于设置date,因为Windows机器上的date格式可能不是所有机器都是一样的。 例如,我可以有意大利机器的dd-MM-yy和美国机器的yy-MM-dd 。 所以如果我的应用程序设置date格式dd-MM-yy对美国机器来说是错误的。
知道我不能使用NTP(机器进入局域网与防火墙与规则只有协议HTTPS端口443) 我怎样才能为所有的Windows机器的Java应用程序正确设置date? 哪一种解决scheme是最好的解决scheme?
注意 : 代理Java应用程序已经在Web服务响应传递的Windows机器上设置了时间戳,因此只需要执行setDateAndTime
在Windows上设置格式为date yyyy-MM-dd的TEST exec date命令(设置错误的date):
我试图用JNA导入kernel32.dll来执行解决方案在Windows 7机器上用时区UTC + 1(意大利国家)进行测试。
我描述的步骤:
1)我导入我的Maven项目的后续依赖关系:
<dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>4.4.0</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>4.3.0</version> </dependency>
2)我实施了以下课程:
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import com.sun.jna.Native; import com.sun.jna.platform.win32.WinBase.SYSTEMTIME; import com.sun.jna.win32.StdCallLibrary; @Component @Qualifier("windowsSetSystemTime") public class WindowsSetSystemTime { /** * coreel32 DLL Interface. kernel32.dll uses the __stdcall calling * convention (check the function declaration for "WINAPI" or "PASCAL"), so * extend StdCallLibrary Most C libraries will just extend * com.sun.jna.Library, */ public interface coreel32 extends StdCallLibrary { boolean SetLocalTime(SYSTEMTIME st); coreel32 instance = (coreel32) Native.loadLibrary("kernel32.dll", coreel32.class); } public boolean SetLocalTime(SYSTEMTIME st) { return coreel32.instance.SetLocalTime(st); } public boolean SetLocalTime(short wYear, short wMonth, short wDay, short wHour, short wMinute, short wSecond) { SYSTEMTIME st = new SYSTEMTIME(); st.wYear = wYear; st.wMonth = wMonth; st.wDay = wDay; st.wHour = wHour; st.wMinute = wMinute; st.wSecond = wSecond; return SetLocalTime(st); } }
3)通过考试班,我试着设置下面的日期和时间
public void setTime(){ System.out.println("START SYNC " + windowsSetSystemTime); windowsSetSystemTime.SetLocalTime((short)2017, (short)10,(short) 29,(short) 11,(short) 35,(short) 0); }
测试结果:因为在这种情况下我获得了正确的日期和时间,因为功能考虑了在2017年10月29日3:00进入的日光节约时间。
在测试之前,时钟被设置:
测试时钟设定后:
通过Windows开发中心文档链接: SetLocalTime文档,我找到了SetLocalTime的逻辑方法到coreel32.dll中
Windows开发人员中心备注 SetLocalTime:
系统在内部使用UTC。 因此,当您调用SetLocalTime时,系统将使用当前时区信息执行转换,包括夏令时设置。 请注意,系统使用当前时间的夏令时设置,而不是您设置的新时间。 因此,为确保正确的结果,现在第一次调用已更新夏令时设置,再次调用SetLocalTime。