【问题标题】:Setting milliseconds of System time with java用java设置系统时间的毫秒数
【发布时间】:2016-02-11 03:48:41
【问题描述】:

是否可以在使用 Java 的 Windows 操作系统上使用毫秒组件设置系统时间? 我正在尝试在几台计算机之间同步时钟,但操作系统 API 似乎只提供格式为:HH:MM:SS 的设置时间。

这是我尝试过的:

public static void main(String[] args) throws InterruptedException, IOException {


    String time="10:00:20"; // this works

    String timeWithMiliseconds = "10:00:20.100"; // this doesn't change time at all

    Runtime rt = Runtime.getRuntime();
    rt.exec("cmd /C time " + time);


}

我想知道如果无法设置毫秒组件,NTP 客户端如何工作?

解决此问题的一种方法是计算服务器应该到达下一秒的时间(以毫秒为单位),然后在该时间休眠。有没有更好、更直接的方法来实现这一点?

【问题讨论】:

  • 因为他们不使用控制台命令设置时间;他们可能使用SetSystemTime 函数,该函数(与任何其他 Windows 函数一样)您无法从 Java 轻松访问。
  • 感谢您的评论。所以不可能使用 ProcessBuilder/Runtime 调用该函数,必须使用 JNI 吗?
  • 为什么不能直接使用 NTP 客户端?
  • 这只是我正在处理的一项任务,不允许这样做。
  • 要调用不属于 Java(但 C ish)的方法,您必须使用 JNI stackoverflow.com/a/17035731/995891(或 jna)。或者您可以通过Runtime 启动一个脚本/自定义 exe,允许以毫秒为单位设置时间

标签: java windows time command-line process


【解决方案1】:

正如 immibis 所说,您可以使用 Windows 函数SetSystemTime 来设置时间。

在下面找到一个使用JNA 4.2调用Windows函数的sn-p

Kernel32 kernel = Kernel32.INSTANCE;
WinBase.SYSTEMTIME newTime = new WinBase.SYSTEMTIME();
newTime.wYear = 2015; 
newTime.wMonth = 11;
newTime.wDay = 10;
newTime.wHour = 12;
newTime.wMinute = 0;
newTime.wSecond = 0;
newTime.wMilliseconds = 0;
kernel.SetSystemTime(newTime);

有关更多信息,请查看 JNA 的来源和这些链接 SetSystemTime Windows functionSYSTEMTIME structure.

2009 年 JNA 简介。Simplify Native Code Access with JNA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-07
    • 2011-08-27
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多