获取当前 GMT 时间

Posted

技术标签:

【中文标题】获取当前 GMT 时间【英文标题】:Getting current GMT time 【发布时间】:2010-10-05 17:33:47 【问题描述】:

C# 中是否有返回 UTC (GMT) 时区的方法?不是基于系统的时间。

基本上,即使我的系统时间不正确,我也想获得正确的 UTC 时间。

【问题讨论】:

请注意:UTC 时间和 GMT 时间并不总是相同的。 UTC 在 .net 中很容易,而 GMT 则不那么容易。 @Jekke - 好吧,他们永远不会走得太远... 为什么不能依靠系统通过 NTP 同步正确的时间? 你找到解决办法了吗? 【参考方案1】:

而不是调用

DateTime.Now.ToUniversalTime()

你可以打电话

DateTime.UtcNow

相同但更短:) 文档here。

【讨论】:

这是基于查看文档的系统时间? Gets a DateTime object that is set to the current date and time on this computer, expressed as the Coordinated Universal Time (UTC)。问题是如何在不依赖系统时钟的情况下获得 UTC 时间。显然我很困惑。【参考方案2】:

不是基于系统的时间?您需要拨打网络时间服务或类似的电话。你可以写一个NTP 客户端,或者只是截屏World Clock ;)

我不相信 .NET 有内置的 NTP 客户端,但有 quite a few available。

【讨论】:

【参考方案3】:

我在 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;

【讨论】:

您可能想使用pool.ntp.org 让它为您选择服务器 啊,有道理。比我的选择器更容易。 @abatishchev 我尝试使用您的想法。但是,它没有用。我收到错误消息“无法建立连接,因为目标机器主动拒绝了它 140.109.1.10:13”” @prabhakaran:试试 UDP,而不是 TCP。或 0.pool.ntp.org【参考方案4】:

如果我要猜测如何获得有保证的准确时间,您必须找到/编写一些 NNTP 类来获取时间服务器的时间。

如果你在谷歌上搜索C# NTP,你可以找到几个implementations,否则检查NTP 协议。

【讨论】:

【参考方案5】:

如果您的系统时间不正确,那么您从 DateTime 类中得到的任何东西都不会有帮助。不过,您的系统可以将时间与时间服务器同步,因此如果打开该功能,各种 DateTime UTC 方法/属性将返回正确的 UTC 时间。

【讨论】:

【参考方案6】:

您可以简单地硬编码一个基础 DateTime 并计算给定 DateTime 与该基础之间的差异,以确定所需的精确 DateTime,如下代码所示:

    string format = "ddd dd MMM yyyy HH:mm:ss";     
    string utcBaseStr = "Wed 18 Nov 2020 07:31:34";
    string newyorkBaseStr = "Wed 18 Nov 2020 02:31:34";     
    string nowNewyorkStr = "Wed 18 Nov 2020 03:06:47";
    
    DateTime newyorkBase = DateTime.ParseExact(newyorkBaseStr, format, CultureInfo.InvariantCulture);
    DateTime utcBase = DateTime.ParseExact(utcBaseStr, format, CultureInfo.InvariantCulture);
    DateTime now = DateTime.ParseExact(nowNewyorkStr, format, CultureInfo.InvariantCulture);
    
    var diffMiliseconds = (now - newyorkBase).TotalMilliseconds;
    DateTime nowUtc = utcBase.AddMilliseconds(diffMiliseconds);
    
    Console.WriteLine("Newyork Base = " + newyorkBase);     
    Console.WriteLine("UTC Base = " + utcBase);
    Console.WriteLine("Newyork Now = " + now);      
    Console.WriteLine("Newyork UTC = " + nowUtc);   

以上代码输出如下:

Newyork Base = 11/18/2020 2:31:34 AM
UTC Base = 11/18/2020 7:31:34 AM
Newyork Now = 11/18/2020 3:06:47 AM
Newyork UTC = 11/18/2020 8:06:47 AM

【讨论】:

以上是关于获取当前 GMT 时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中获取或打印 GMT 时区的当前日期时间? [复制]

从当前日期获取 GMT 字符串

如何在 Dart/Flutter 中获取当前时间的 GMT 时间偏移值

IOS - 以 GMT 格式获取设备的当前时区

如何在 java 中获取当前的 Linux GMT 时间戳?

如何在Elm中以GMT显示当前时区偏移量