获取远程服务器的准确时间

在C#中,如何查询远程服务器的当前时间?

类似的function

net time \\servername 

但返回包含秒的日期戳。

谢谢

Windows时间服务实现NTP。 这是NTP客户端的C#实现 。 可以在简单网络时间协议客户端找到使用它的Windows GUI。 这是由Valer Bocan提供的。

您可以使用NetRemoteTODfunction。

来自http://bytes.com/groups/net-c/246234-netremotetod-usage的示例:

 // The pointer. IntPtr pintBuffer = IntPtr.Zero; // Get the time of day. int pintError = NetRemoteTOD(@"\\sony_laptop", ref pintBuffer); // Get the structure. TIME_OF_DAY_INFO pobjInfo = (TIME_OF_DAY_INFO) Marshal.PtrToStructure(pintBuffer, typeof(TIME_OF_DAY_INFO)); // Free the buffer. NetApiBufferFree(pintBuffer); 

您可以尝试在端口13上获取白天:

 System.Net.Sockets.TcpClient t = new System.Net.Sockets.TcpClient ("yourmachineHOST", 13); System.IO.StreamReader rd = new System.IO.StreamReader (t.GetStream ()); Console.WriteLine (rd.ReadToEnd ()); rd.Close(); t.Close(); 

在Reed Copsey(&David Laing)回答中使用C#NTP客户端 ,您可以使用以下命令从域控制器/ NTP服务器获取时间“现在”标记(以毫秒为单位):

 InternetTime.SNTPClient sntp = new InternetTime.SNTPClient("ntp1.ja.net"); sntp.Connect(false); // true to update local client clock DateTime dt = sntp.DestinationTimestamp.AddMilliseconds(sntp.LocalClockOffset); string timeStampNow = dt.ToString("dd/MM/yyyy HH:mm:ss.fff"); 

简单网络时间协议客户端

如果您可以使用UNC路径访问远程系统的文件系统 (例如\\remotehost\foo\bar ;例如使用Windows资源管理器),则可以检索远程日期时间, 即使它不是Windows系统 ,也可以使用以下解决方法。 创建一个虚拟文件,读取它的写入时间并将其丢弃。 它也适用于本地主机。

 public DateTime filesystemDateTime(string path) { //create temp file string tempFilePath = Path.Combine(path, "lampo.tmp"); using (File.Create(tempFilePath)) { } //read creation time and use it as current source filesystem datetime DateTime dt = new FileInfo(tempFilePath).LastWriteTime; //delete temp file File.Delete(tempFilePath); return dt; } 
 class RemoteSystemTime { static void Main(string[] args) { try { string machineName = "vista-pc"; System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.FileName = "net"; proc.StartInfo.Arguments = @"time \\" + machineName; proc.Start(); proc.WaitForExit(); List results = new List(); while (!proc.StandardOutput.EndOfStream) { string currentline = proc.StandardOutput.ReadLine(); if (!string.IsNullOrEmpty(currentline)) { results.Add(currentline); } } string currentTime = string.Empty; if (results.Count > 0 && results[0].ToLower().StartsWith(@"current time at \\" + machineName.ToLower() + " is ")) { currentTime = results[0].Substring((@"current time at \\" + machineName.ToLower() + " is ").Length); Console.WriteLine(DateTime.Parse(currentTime)); Console.ReadLine(); } } catch (Exception ex) { Console.WriteLine(ex.Message); Console.ReadLine(); } } 

以下是更完整的实现。

用法: DateTime? now = RemoteTOD.GetNow(@"\\ServerName"); DateTime? now = RemoteTOD.GetNow(@"\\ServerName");

 using System; using System.ComponentModel; using System.Runtime.InteropServices; //https://docs.microsoft.com/en-us/windows/desktop/api/lmremutl/nf-lmremutl-netremotetod public static class RemoteTOD { // Important: CharSet must be Unicode otherwise error 2184 is returned [DllImport("netapi32.dll", SetLastError=true, CharSet=CharSet.Unicode)] private static extern int NetRemoteTOD(String UncServerName, ref IntPtr BufferPtr); [DllImport("netapi32.dll")] private static extern void NetApiBufferFree(IntPtr bufptr); public static DateTime? GetNow(String serverName, bool throwException = false) { IntPtr ptrBuffer = IntPtr.Zero; int result = NetRemoteTOD(serverName, ref ptrBuffer); if (result != 0) { if (throwException) throw new Win32Exception(Marshal.GetLastWin32Error()); return null; } TIME_OF_DAY_INFO tod = (TIME_OF_DAY_INFO) Marshal.PtrToStructure(ptrBuffer, typeof(TIME_OF_DAY_INFO)); NetApiBufferFree(ptrBuffer); // must be freed using NetApiBufferFree according to the documentation //DateTime d0 = new DateTime(1970,1,1); //d0 = d0.AddSeconds(tod.elapsedt); DateTime nowUtc = new DateTime(tod.year, tod.month, tod.day, tod.hour, tod.minute, tod.second, 10 * tod.hunds); DateTime now = nowUtc.ToLocalTime(); return now; } } [StructLayout(LayoutKind.Sequential)] public struct TIME_OF_DAY_INFO { ///The number of seconds since 00:00:00, January 1, 1970, GMT. public int elapsedt; ///The number of milliseconds from an arbitrary starting point (system reset). Typically, this member is read twice, ///once when the process begins and again at the end. To determine the elapsed time between the process's start and finish, ///you can subtract the first value from the second. public int msecs; ///The current hour. Valid values are 0 through 23. public int hour; ///The current minute. Valid values are 0 through 59. public int minute; ///The current second. Valid values are 0 through 59. public int second; ///The current hundredth second (0.01 second). Valid values are 0 through 99. public int hunds; ///The time zone of the server. This value is calculated, in minutes, from Greenwich Mean Time (GMT). For time zones ///west of Greenwich, the value is positive; for time zones east of Greenwich, the value is negative. A value of –1 indicates ///that the time zone is undefined. public int timezone; ///The time interval for each tick of the clock. Each integral integer represents one ten-thousandth second (0.0001 second). public int tinterval; ///The day of the month. Valid values are 1 through 31. public int day; ///The month of the year. Valid values are 1 through 12. public int month; ///The year. public int year; ///The day of the week. Valid values are 0 through 6, where 0 is Sunday, 1 is Monday, and so on. public int weekday; }