Existe-t-il une méthode en C # qui renvoie le fuseau horaire UTC (GMT)? Pas basé sur l'heure du système.
Fondamentalement, je veux obtenir l'heure UTC correcte même si l'heure de mon système n'est pas correcte.
Au lieu d'appeler
DateTime.Now.ToUniversalTime()
tu peux appeler
DateTime.UtcNow
Même chose mais plus court :) Documentation ici .
Pas basé sur le temps du système? Vous auriez besoin d'appeler un service de temps réseau ou quelque chose de similaire. Vous pouvez écrire un client NTP , ou simplement un écran de veille Horloge mondiale ;)
Je ne crois pas que .NET ait un client NTP intégré, mais il y en a pas mal disponible .
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;
}
Si je devais parier sur la façon d'obtenir une heure précise garantie, vous devriez trouver/écrire une classe NNTP pour obtenir le temps d'un serveur de temps.
Si vous recherchez C # NTP sur google, vous pouvez trouver quelques implémentations , sinon vérifiez le protocole NTP .
Si l'heure de votre système n'est pas correcte, rien de ce que vous retirez de la classe DateTime ne vous aidera. Cependant, votre système peut synchroniser l'heure avec les serveurs de temps. Si cette option est activée, les différentes méthodes/propriétés DateTime UTC renverront l'heure UTC correcte.