web-dev-qa-db-fra.com

Java - Comment obtenir la date actuelle indépendamment de la date système?

Je veux connaître la date et l'heure actuelles.

Le code

Calendar.getInstance();

représente une date et une heure du système sur lequel le programme est exécuté et la date du système peut être fausse.

Donc, y a-t-il un moyen par lequel je peux obtenir la date et l'heure actuelles correctes indépendamment des dates et heures du système sur lequel le programme est exécuté?

17
Yatendra Goel

Si vous êtes sur Internet, vous pourrez peut-être demander à une source de temps connue et de confiance. Si la personne qui exécute votre programme veut empêcher votre programme de le faire (comme si vous lui aviez donné une licence limitée dans le temps et ne voulaient pas payer plus de temps), ils pourraient usurper ou bloquer cette connexion.

Sur l'un des projets sur lesquels je travaillais, nous avons placé dans le matériel une source de temps sécurisée et fiable qui ne pouvait pas être falsifiée. Conçu pour le cryptage et la gestion des licences, il disposait d'une bibliothèque Java pour y accéder. Désolé, je ne me souviens pas du nom de l'appareil.

Donc, la réponse est peut-être oui, peut-être non.

4
Paul Tomblin

Dans les versions de Java antérieures à 1.1, il était standard d’utiliser la classe Date :

Date now = new Date();     // Gets the current date and time
int year = now.getYear();  // Returns the # of years since 1900

Cependant, dans les versions plus récentes de Java, une grande partie de la classe Date a été déconseillée (en particulier la méthode getYear). Il est maintenant plus standard d’utiliser le Calendar class:

Calendar now = Calendar.getInstance();   // Gets the current date and time
int year = now.get(Calendar.YEAR);       // The current year
40
theJollySin

Je ne comprends pas tout à fait votre question mais je peux répondre à votre titre:

GregorianCalendar gc = new GregorianCalendar(System.getCurrentTimeMillis());
int year = gc.get(Calendar.YEAR);
7

Votre système a-t-il accès à Internet? Si c'est le cas, vous pouvez utiliser la synchronisation avec des services horaires précis (par exemple: http://tldp.org/HOWTO/TimePrecision-HOWTO/ntp.html ) et accorder ce que vous souhaitez.

3
Dewfy

Voici un code pour récupérer la date au format HTTP (généralement le fuseau horaire UTC) à partir du serveur Web de votre choix.

Bien sûr, si vous n’avez aucun contrôle sur le matériel physique et le système d’exploitation, rien ne peut garantir que vous pourrez parler au serveur Web que vous demandez, mais de toute façon.

package some.package;

import Java.io.IOException;
import Java.net.URL;
import Java.net.URLConnection;
import Java.util.List;
import Java.util.Map;

public class Test {

  private static String getServerHttpDate(String serverUrl) throws IOException {
    URL url = new URL(serverUrl);
    URLConnection connection = url.openConnection();

    Map<String, List<String>> httpHeaders = connection.getHeaderFields();

    for (Map.Entry<String, List<String>> entry : httpHeaders.entrySet()) {
      String headerName = entry.getKey();
      if (headerName != null && headerName.equalsIgnoreCase("date")) {
        return entry.getValue().get(0);
      }
    }
    return null;
  }

  public static void main(String[] args) throws IOException {
    String serverUrl = args.length > 0 ? args[0] : "https://google.com";
    System.out.println(getServerHttpDate(serverUrl));
  }

}
0
Cosimo

Les méthodes de niveau de programmation sont développées pour obtenir la date et l'heure de votre système lui-même. Vous ne pouvez pas les modifier pour obtenir les dates, à l'exception du système spécifié.

Pour votre besoin supplémentaire, si vous souhaitez l’avoir, vous aurez besoin d’une synchronisation entre votre machine cliente et votre serveur.

0
Mr.Expert