Comment puis-je régler l'Heure du Système en Java?
Est-il possible de modifier l'Heure du Système en Java?
Il devrait fonctionner sous Windows et Linux. J'ai essayé avec le Runtime
Classe, mais il y a un problème avec les autorisations.
C'est mon code:
String cmd="date -s \""+datetime.format(ntp_obj.getDest_Time())+"\"";
try {
Runtime.getRuntime().exec(cmd);
} catch (IOException e1) {
//TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println(cmd);
La sortie de cmd
est:
date -s "06/01/2011 17:59:01"
Mais le Système de temps est le même qu'avant.
Je mettrai le temps parce que je suis en train d'écrire un NTP-Client, et là, je reçois le temps à partir d'un NTP-Server et le mettra.
- Pourquoi avez-vous besoin de régler l'heure du Système?
- Également inclure l'actuel code et l'erreur/problème rencontré (par exemple, ce qui était "mal" avec les autorisations?)
- Parce que l'heure du Système est incorrecte / pas exacte?
- Vous avez besoin d'un autre moment de la commande sur Windows. Moment de l'exécution.getRuntime().exec("cmd /C" + strTimeToSet); // hh:mm:ss
Vous devez vous connecter pour publier un commentaire.
Java ne dispose pas d'une API pour le faire.
La plupart des commandes du système pour le faire, il nécessite des droits d'administrateur, de sorte
Runtime
ne peut pas vous aider si vous exécutez l'ensemble du processus en tant qu'administrateur/root ou vous utilisezrunas
/sudo
.En fonction de ce que vous avez besoin, vous pouvez remplacer
System.currentTimeMillis()
. Il y a deux approches:Remplacer tous les appels à
System.currentTimeMillis()
avec un appel à une méthode statique de votre propre que vous pouvez remplacer:Pour les tests, vous pouvez remplacer l'INSTANCE avec quelque chose qui renvoie à d'autres moments. Ajouter plus de méthodes pour créer
Date
et objets similaires.Si pas tout le code est sous votre contrôle, installer un
ClassLoader
qui renvoie à une mise en œuvre différente pourSystem
. Ce qui est plus simple que vous ne le pensez:java.lang.*
nom est toujours le travail?java.lang
autant que classloading est concerné. Il y a doit être rien de magique comme JIT et VM sont concernés - si vous remplacezString.class
avec quelque chose d'autre, cela devrait fonctionner puisque la classe est chargée comme rien d'autre.SecurityManager
installé et puis, ce genre de choses ne sont pas plus possible. Utilisationjoda-time
à la place.Un moyen serait d'utiliser les commandes natives.
pour Windows, deux commandes (date et heure) sont tenus de:
pour linux, une commande unique gère à la fois la date et l'heure:
exec()
fourches d'un nouveau processus pour chaque appel, je le recommande à concat les deux fenêtres de l'appelle de la sorte:Runtime.getRuntime().exec("cmd /C date " + strDateToSet + "& time " + strTimeToSet);
Vous ne pouvez régler l'heure du système en exécutant un outil de ligne de commande en tant que root ou Administrateur. La commande sont différentes, mais vous pouvez vérifier l'OS de la première et exécutez la commande appropriée pour cet OS.
Vous pouvez utiliser
JNI
pour le réglage de l'heure du système. Ce serait le travail sur Windows. Vous avez besoin de savoirJNI
etC
.C'est la JNI de la fonction, le prototype sera généré par le
javah
utilitaireLa Java JNI wrapper serait
Et enfin, il
Il y a des cas où le processus ne fonctionne pas avec les droits d'admin, mais il a encore les autorisations pour définir l'heure du système. Il est possible d'utiliser Java Accès Natif pour modifier l'heure du système et ont toutes les sources en Java (plus simple en comparaison avec JNI).
D'exécuter ce code sous windows administrateur de modèle.
Vous pouvez changer la date ou l'ajout de la date actuelle date à l'aide du code ci-dessous. Il fonctionne parfaitement sous windows:
Dans le code ci-dessus, j'ai ajouté 1 jour à la date du jour, Vous pouvez passer à n'importe quelle date pour strExpectedDate et cela ne fonctionne que sur windows