检索准确日期的最佳方法?

时间:2009-11-05 17:49:33

标签: c# winforms date

检索当前日期的最佳方法是什么?目前我正在存储这样的日期:

string date = DateTime.Now.ToString("yyyyMMdd");

显然,如果用户更改了系统上的日期,这也会受到影响。

我需要一种方法来访问准确的日期(最好是在中央时间)并将其作为字符串存储在我的应用程序中。有什么想法吗?

8 个答案:

答案 0 :(得分:4)

定义“准确”?如果您不能信任系统日期,那么您需要从外部源(即原子钟)获取时间。但是用户可能会阻止您的程序获取它(即拔掉网络电缆,用软件防火墙阻止您的时间查询)。

那你真正想要的是什么?

答案 1 :(得分:2)

无论您在本地获得什么日期/时间,都取决于当前系统的时间准确度。如果您需要独立的准确时间,则需要从Yahoo's Server Time等时间网络服务外部获取。

答案 2 :(得分:2)

编辑:这有效,试一试:

private string GetCurrentDateTime()
{
    WebRequest request = WebRequest.Create(@"http://developer.yahooapis.com/TimeService/V1/getTime?appid=Test");
    // request.Proxy = new WebProxy("PROXYSERVERNAME", 8080); // You may or may not need this
    WebResponse response = request.GetResponse();      

    Double currentTimeStamp = 0;
    using (Stream stream = response.GetResponseStream())
    {
        using (XmlTextReader xmlReader = new XmlTextReader(stream))
        {
            while (xmlReader.Read())
            {
                switch (xmlReader.NodeType)
                {
                    case XmlNodeType.Element:
                        if (xmlReader.Name == "Timestamp")
                        {
                            currentTimeStamp = Convert.ToDouble(xmlReader.ReadInnerXml());
                        }
                        break;
                }
            }

            xmlReader.Close();
        }
    }

    DateTime yahooDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    return yahooDateTime.AddSeconds(currentTimeStamp).AddHours(2).ToString("yyyyMMdd");     
}

答案 3 :(得分:1)

您可以在提供结果的服务器上实现非常简单的Web服务或RESTful调用。只要您确信服务器的日期/时间是正确的,这就可以工作。

答案 4 :(得分:1)

由于用户可以更改BIOS上的时间,因此您不能相信计算机是准确的。

您唯一的另一个选择是要求他们可以访问互联网,然后您可以呼叫网络服务,并拨打电话,但如果您要偏执,并限制他们知道的数量,使用RSA加密对其进行加密,以验证您的服务是否提供了日期。

答案 5 :(得分:0)

始终以UTC时间存储 - 以后您将为自己省去一大堆麻烦。以UTC格式存储并转换为您需要的任何当地时间,包括夏令时,在您计算时需要它。

此外,如果时间不需要人类在存储中可读,您可以将其存储在Ticks中,以便最不容易出错:

string ticks = DateTimeOffset.UtcNow.Ticks.ToString();

DateTimeOffset stampUtc = new DateTimeOffset(long.Parse(ticks),TimeSpan.Zero);

DateTimeOffset stampLocal = stampUtc.ToLocalTime();

答案 6 :(得分:0)

如果你需要捕获当前时间并且不想连接到机器上,代码运行时设置了正确的日期/时间,你可以使用NTP从网络(或互联网)检索当前时间)...假设机器主动连接到一个。

我相信美国海军维持着一组NTP服务器。查看:http://tycho.usno.navy.mil/ntp.html

如果您需要对当前时间进行超级安全,高弹性访问,则需要对正在运行的硬件进行一定程度的控制。毕竟,用户可以拉网络线,欺骗网络上的IP地址,阻止端口和IP地址,更改他们的HOSTS文件,以及当时可能干扰网络请求的各种事情。

答案 7 :(得分:0)

这是一个老问题。我相信你正在寻找NTP(网络时间协议)。浏览http://time.gov/about.html,您可以找到一个公共服务器,它将为您提供标准时间。

另外,要使用NTP,您可能需要查看此内容。 How to Query an NTP Server using C#?