代码之家  ›  专栏  ›  技术社区  ›  David Laing

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

  •  4
  • David Laing  · 技术社区  · 16 年前

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

    类似于

    net time \\servername
    

    但返回包含秒的日期戳。

    谢谢

    8 回复  |  直到 7 年前
        1
  •  1
  •   bluish dmajkic    13 年前

    Windows时间服务实现NTP。这里是一个 C# implementation of an NTP client . 使用它的Windows GUI可以在 Simple Network Time Protocol Client . 是瓦勒·博肯写的。

        2
  •  5
  •   Patrick McDonald    16 年前

    你可以使用 NetRemoteTOD 功能。

    从一个例子 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);
    
        3
  •  3
  •   Zanoni    16 年前

    您可以尝试在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();
    
        4
  •  1
  •   Ken    14 年前

    使用 C# NTP client 在Reed Copsey(&David Laing)答案中,您可以从域控制器/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");
    
        6
  •  0
  •   bluish dmajkic    13 年前

    如果您可以使用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;
    }
    
        7
  •  0
  •   Brad Larson    12 年前
    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<string> results = new List<string>();
                    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();
                }
            }
    
        8
  •  0
  •   Loathing    7 年前

    下面是一个更完整的实现。

    用途: 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 {
    
        ///<summary>The number of seconds since 00:00:00, January 1, 1970, GMT.</summary>
        public int elapsedt;
    
        ///<summary>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.</summary>
        public int msecs;
    
        ///<summary>The current hour. Valid values are 0 through 23.</summary>
        public int hour;
    
        ///<summary>The current minute. Valid values are 0 through 59.</summary>
        public int minute;
    
        ///<summary>The current second. Valid values are 0 through 59.</summary>
        public int second;
    
        ///<summary>The current hundredth second (0.01 second). Valid values are 0 through 99.</summary>
        public int hunds;
    
        ///<summary>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.</summary>
        public int timezone;
    
        ///<summary>The time interval for each tick of the clock. Each integral integer represents one ten-thousandth second (0.0001 second).</summary>
        public int tinterval;
    
        ///<summary>The day of the month. Valid values are 1 through 31.</summary>
        public int day;
    
        ///<summary>The month of the year. Valid values are 1 through 12.</summary>
        public int month;
    
        ///<summary>The year.</summary>
        public int year;
    
        ///<summary>The day of the week. Valid values are 0 through 6, where 0 is Sunday, 1 is Monday, and so on.</summary>
        public int weekday;
    }