代码之家  ›  专栏  ›  技术社区  ›  user

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

  •  2
  • user  · 技术社区  · 15 年前

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

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

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

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

    8 回复  |  直到 9 年前
        1
  •  2
  •   Philip Wallace    15 年前

    编辑 :这是可行的,请尝试一下:

    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");     
    }
    
        2
  •  4
  •   Gabriel Magana    15 年前

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

    那你真正想要的是什么?

        3
  •  2
  •   Traveling Tech Guy    15 年前

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

        4
  •  1
  •   kindohm    15 年前

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

        5
  •  1
  •   James Black    15 年前

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

    您唯一的其他选择是要求他们能够访问互联网,然后您可以呼叫一个WebService,并进行呼叫,但是如果您将要偏执,并限制他们知道正在发生的事情,请使用RSA加密对其进行加密,以验证您的服务是否提供了日期。

        6
  •  0
  •   Jason Kleban    15 年前

    总是以UTC时间存储-以后你会省去很多麻烦。存储在UTC中,并在计算时转换为所需的任何本地时间,包括夏令时。

    此外,如果时间不需要在存储中为人可读,您可以将其存储在滴答声中,这样最不容易出错:

    字符串ticks=datetimeoffset.utcnow.ticks.toString();

    datetimeoffset stamputc=新的datetimeoffset(long.parse(ticks),timeSpan.zero);

    datetimeoffset stampplocal=stamputc.toLocalTime();

        7
  •  0
  •   LBushkin    15 年前

    如果您需要捕获当前时间,并且不希望与运行代码的计算机耦合,并且设置了正确的日期/时间,则可以使用NTP从网络(或Internet)中检索当前时间…假设机器主动连接到一个。

    我相信美国海军拥有一组NTP服务器。退房: http://tycho.usno.navy.mil/ntp.html

    如果您需要对当前时间进行超级安全、高弹性的访问,那么您需要对正在运行的硬件进行某种程度的控制。毕竟,用户可以拔出他们的网络电缆,欺骗网络上的IP地址,阻塞端口和IP地址,更改他们的主机文件,以及各种可能暂时干扰网络请求的事情。

        8
  •  0
  •   Community CDub    8 年前

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

    另外,要使用ntp,您可能需要查看这个。 How to Query an NTP Server using C#?