Meilleure façon de définir la date et l'heure sur la machine Windows par application java


Je travaille avec une application java agent et elle est installée sur plusieurs machines Windows dans différents endroits du monde. Je voudrais synchroniser périodiquement l'horloge Windows (Date et heure). J'ai déjà trouvé la commande native pour définir l'heure dans Windows par code java:

Runtime.getRuntime().exec("cmd /C date " + strDateToSet); // dd-MM-yy
Runtime.getRuntime().exec("cmd /C time " + strTimeToSet); // hh:mm:ss

Ou pour exécuter

Runtime.getRuntime().exec("cmd /C date " + strDateToSet + "& time " + strTimeToSet);

Mais le problème principal est focalisé sur la date définie, car il est possible que le format de date sur les machines Windows ne soit pas le même pour toutes les machines. Par exemple je pourrais avoir jj-MM-aa pour machine italienne et aa-MM-jj pour NOUS de la machine. Donc, si mon application définit la date avec le format dd-MM-aa wuold être faux pour NOUS machine.

Sachant que je ne peux pas utiliser NTP (Machines en LAN avec Pare-feu sans règles uniquement protocole HTTPS port 443) comment puis-je définir la date correctement par l'application java pour toutes les machines Windows ? Quelle est la meilleure solution à la fois semplicité et maintenabilité ?

Remarque: Agent java l'application a déjà l'horodatage à définir sur la machine Windows passé par la réponse du service Web, est donc nécessaire uniquement pour faire le setDateAndTime

TEST exec date commande avec format date aaaa-MM-jj sous Windows (définir une mauvaise date): entrez la description de l'image ici

Author: Stefano, 2017-04-25

1 answers

J'ai essayé d'implémenter la solution avec JNA important kernel32.dll a effectué le test sur la machine Windows 7 avec le fuseau horaire UTC + 1 (pays Italie).

, je décris les étapes:

1) J'ai importé mon projet maven les dépendances suivantes:

<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) J'ai implémenté la classe suivie:

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 {

    /**
     * Kernel32 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 Kernel32 extends StdCallLibrary {

        boolean SetLocalTime(SYSTEMTIME st);

        Kernel32 instance = (Kernel32) Native.loadLibrary("kernel32.dll", Kernel32.class);

    }

    public boolean SetLocalTime(SYSTEMTIME st) {
        return Kernel32.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) Par la classe de test, j'ai essayé de définir la date et l'heure suivies

public void setTime(){
        System.out.println("START SYNC " + windowsSetSystemTime);

        windowsSetSystemTime.SetLocalTime((short)2017, (short)10,(short) 29,(short) 11,(short) 35,(short) 0);
    }

RÉSULTAT DU TEST: En conséquence dans ce cas j'ai obtenu la date et l'heure correctes parce que le fonction considérée comme le gain d'heure d'hiver de jour qui entrent à 29 Octobre 2017 3: 00.

Avant le test, l'horloge était réglée:

entrez la description de l'image ici

Après le jeu d'horloge de test:

entrez la description de l'image ici

J'ai découvert la méthode logic SetLocalTime dans Kernel32.dll par la documentation du centre de développement Windows sur le lien: SetLocalTime documentation

Centre de développement Windows REMARQUES SetLocalTime:

Le système utilise UTC en interne. Donc, lorsque vous appelez SetLocalTime, le système utilise les informations de fuseau horaire en cours pour effectuer la conversion, y compris le réglage de l'heure d'été. Notez que le système utilise de l'heure réglage de l'heure actuelle, pas le nouveau temps de réglage. Par conséquent, pour assurer le résultat correct, appelez SetLocalTime une deuxième fois, maintenant que le premier appel a mis à jour le réglage de l'heure d'été.

 2
Author: Stefano, 2017-05-03 07:20:02