41 votes

Heure GMT actuelle

Existe-t-il une méthode en C # qui renvoie le fuseau horaire UTC (GMT)? Pas basé sur le temps du système.

En gros, je veux obtenir l'heure UTC correcte même si l'heure de mon système n'est pas correcte.

37voto

Alex Points 3871

Au lieu d'appeler

 DateTime.Now.ToUniversalTime()
 

tu peux appeler

 DateTime.UtcNow
 

Même chose mais plus courte :) Documentation ici .

18voto

Jon Skeet Points 692016

Pas basé sur le temps du système? Vous devez appeler un service d’heure réseau ou quelque chose de similaire. Vous pouvez écrire un client NTP , ou simplement screenscrape World Clock ;)

Je ne crois pas que .NET ait un client NTP intégré, mais il en existe plusieurs .

7voto

Nicki Points 921

J'utilise ceci de UNITY

 //Get a NTP time from NIST
//do not request a nist date more than once every 4 seconds, or the connection will be refused.
//more servers at tf.nist.goc/tf-cgi/servers.cgi
public static DateTime GetDummyDate()
{
    return new DateTime(1000, 1, 1); //to check if we have an online date or not.
}
public static DateTime GetNISTDate()
{
    Random ran = new Random(DateTime.Now.Millisecond);
    DateTime date = GetDummyDate();
    string serverResponse = string.Empty;

    // Represents the list of NIST servers
    string[] servers = new string[] {
        "nist1-ny.ustiming.org",
        "time-a.nist.gov",
        "nist1-chi.ustiming.org",
        "time.nist.gov",
        "ntp-nist.ldsbc.edu",
        "nist1-la.ustiming.org"                         
    };

    // Try each server in random order to avoid blocked requests due to too frequent request
    for (int i = 0; i < 5; i++)
    {
        try
        {
            // Open a StreamReader to a random time server
            StreamReader reader = new StreamReader(new System.Net.Sockets.TcpClient(servers[ran.Next(0, servers.Length)], 13).GetStream());
            serverResponse = reader.ReadToEnd();
            reader.Close();

            // Check to see that the signature is there
            if (serverResponse.Length > 47 && serverResponse.Substring(38, 9).Equals("UTC(NIST)"))
            {
                // Parse the date
                int jd = int.Parse(serverResponse.Substring(1, 5));
                int yr = int.Parse(serverResponse.Substring(7, 2));
                int mo = int.Parse(serverResponse.Substring(10, 2));
                int dy = int.Parse(serverResponse.Substring(13, 2));
                int hr = int.Parse(serverResponse.Substring(16, 2));
                int mm = int.Parse(serverResponse.Substring(19, 2));
                int sc = int.Parse(serverResponse.Substring(22, 2));

                if (jd > 51544)
                    yr += 2000;
                else
                    yr += 1999;

                date = new DateTime(yr, mo, dy, hr, mm, sc);

                // Exit the loop
                break;
            }
        }
        catch (Exception ex)
        {
            /* Do Nothing...try the next server */
        }
    }
return date;
}
 

3voto

Sciolist Points 1481

Si je devais parier, devine comment obtenir une garantie de temps précis, vous auriez à trouver / écrire quelques NNTP classe pour obtenir les temps d'arrêt d'un serveur de temps.

Si vous recherchez C# NTP sur google, vous pouvez trouver quelques implémentations, sinon vérifier le NTP protocole.

2voto

Rob Prouse Points 9193

Si l'heure système n'est pas correcte, rien de ce que vous obtenez en dehors de la classe DateTime ne vous aidera. Votre système peut cependant synchroniser l'heure avec les serveurs de temps. Par conséquent, si cette option est activée, les différentes méthodes / propriétés DateTime UTC renverront l'heure UTC correcte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X