2010-05-23 5 views
17

Je veux connaître la date et l'heure actuelles.Java - Comment obtenir la date du jour indépendamment de la date du système?

Le code

Calendar.getInstance(); 

représente une date et l'heure du système sur lequel le programme est en cours d'exécution et la date du système peut se tromper.

Alors Y a-t-il un moyen par lequel je peux obtenir une date et une heure correctes, quelle que soit la date et l'heure du système sur lequel le programme est exécuté?

+2

La date est une chose relative ... Il n'y a pas de «date actuelle correcte», sauf si vous faites référence à un fuseau horaire spécifique. –

+0

ok .. comment puis-je obtenir la bonne date et l'heure d'un fuseau horaire particulier? –

+0

Vous devez commencer par la date et l'heure de votre système actuel - est-ce OK? – Mark

Répondre

4

Si vous êtes sur Internet, vous pouvez être en mesure de demander à une source de temps connue et fiable. Si la personne qui exécute votre programme veut empêcher votre programme de le faire (comme si vous lui avez donné une licence limitée dans le temps et qu'elle ne veut pas payer plus longtemps), elle pourrait usurper ou bloquer cette connexion.

Sur un projet que j'étais, nous avons placé une source de temps sécurisé et fiable dans le matériel qui ne pouvait pas être falsifié. Il a été conçu pour le cryptage et la licence, et avait 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.

0

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 sauf le système spécifié.

Pour vos besoins supplémentaires, si vous souhaitez vraiment l'avoir, vous aurez besoin d'une synchronisation entre votre machine client et votre serveur.

7

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); 
39

Dans les versions de Java avant 1.1 était la norme à 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 nouvelles versions de Java, une grande partie de la classe Date a été abandonnée (en particulier la méthode getYear). Il est maintenant plus standard d'utiliser la Calendar classe:

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

Wow, 29 upvotes et il ne répond pas à la question, qui a spécifiquement demandé comment obtenir la date réelle lorsque l'horloge du système est erronée. –

+0

@Paul Tomblin Le titre original de cette question était "Java - Comment obtenir l'année en cours?" ce qui ne correspond pas à la question réelle. Modifié cela. – ltlBeBoy

+0

@ltlBeBoy Je suppose que c'est trop de s'attendre à ce que les answerers et les upvoters de questions lisent plus que le titre. –

0

Voici un code pour récupérer la date au format HTTP (généralement fuseau horaire UTC) à partir d'un 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 garantit que vous serez en mesure de 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)); 
    } 

} 
Questions connexes