Лучший способ получить точную дату?

2

Каков наилучший способ получить текущую дату? В настоящее время я сохраняю дату следующим образом:

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

Очевидно, что если пользователь изменяет дату в своей системе, это также будет затронуто.

Мне нужен способ получить точную дату (желательно в центральное время) и сохранить ее как строку в моем приложении. Любые идеи?

  • 1
    Что вы пытаетесь достичь? Защита программного обеспечения?
  • 1
    Нет, это для сравнения двух строк дат друг с другом. Это хорошая идея, хотя. Никогда не думал об этом.
Показать ещё 1 комментарий
Теги:
date
winforms

8 ответов

2
Лучший ответ

EDIT. Это работает, попробуйте:

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");     
}
  • 0
    Не будет ли это все еще зависеть от системной даты?
  • 0
    @Nate - да. Я нашел образец, который получает время от Yahoo вместо этого.
Показать ещё 10 комментариев
4

Определить "точную"? Если вы не можете доверять системной дате, вам нужно получить время от внешнего источника (т.е. Атомных часов). Но пользователь может заблокировать вашу программу от ее получения (т.е. Отключить сетевой кабель, блокируя ваш запрос времени с помощью программного брандмауэра).

Так что же вы действительно хотите?

  • 0
    Ну, приложению необходимо сетевое соединение, поскольку оно подключается к онлайн-ресурсам. Без одного приложения было бы бесполезно, ха-ха. Пользователи уже знают это.
  • 2
    В зависимости от того, что это за ресурсы, вы можете получить дату таким образом. Если это веб-служба (или сервер приложений, или аналогичный) под вашим контролем, которая является целью подключения, просто получите дату от службы. Если нет, найдите дату на атомных часах где-нибудь.
2

Независимо от даты и времени, которое вы получаете локально, зависит от текущей точности системного времени. Если вы хотите независимого точного времени, вам нужно получить его извне из веб-службы времени, например Yahoo Server Time.

1

Так как пользователь может изменить время на биосе, вы не можете доверять тому, что компьютер будет точным.

Ваш единственный другой выбор требует наличия у них доступа к Интернету, затем вы можете позвонить в веб-сервис и позвонить, но если вы собираетесь быть параноиком и ограничить, насколько они знают, зашифруйте его с помощью RSA-шифрования, чтобы убедиться, что ваша служба дала дату.

  • 0
    Не беспокоиться о шифровании или что-то в этом роде. Просто нужна точная дата, которая не зависит от системы (веб-сервис, как вы сказали). Любые рекомендации?
  • 0
    Вы должны написать свой собственный, чтобы убедиться, что он является точным для всех приложений, но вот краткое обсуждение о веб-сервисах времени: weblogs.asp.net/jgalloway/archive/2004/04/08/110029.aspx
1

Вы можете реализовать очень простой веб-сервис или RESTful-вызов на сервере, который обеспечит результат. Это будет работать до тех пор, пока вы доверяете правильности даты/времени сервера.

0

Если вам нужно зафиксировать текущее время и не хотите, чтобы его связывали с машиной, код работал с правильной установкой даты/времени, вы можете использовать NTP для извлечения текущего времени из сети (или Интернета)... предполагая, что машина активно подключена к одному.

Я считаю, что ВМС США поддерживают группу серверов NTP. Отъезд: http://tycho.usno.navy.mil/ntp.html

Если вам нужен супер-безопасный, очень устойчивый доступ к текущему времени, вам нужно будет иметь некоторый уровень контроля над оборудованием, на котором вы работаете. В конце концов, пользователи могут потянуть свой сетевой кабель, обмануть IP-адреса в сети, заблокировать порты и IP-адреса, изменить их файл HOSTS, всевозможные вещи, которые могут помешать сетевому запросу на время.

0

Всегда сохраняйте в UTC время - вы сэкономите на себе массу проблем позже. Сохраняйте в UTC и конвертируйте в любое местное время, в котором вы нуждаетесь, включая летнее время, в то время, когда оно вам понадобится для вашего расчета.

Кроме того, если время не должно быть человеком, читаемым в хранилище, вы можете сохранить его в Ticks как наименее подверженное ошибкам:

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

DateTimeOffset stampUtc = новый DateTimeOffset (long.Parse(ticks), TimeSpan.Zero);

DateTimeOffset stampLocal = stampUtc.ToLocalTime();

  • 0
    Не будет ли использование DateTimeOffset по-прежнему полагаться на системную дату / время?
  • 0
    Да. Я думаю, что я прочитал акцент на неправильной части вашего вопроса. От чего ты пытаешься защитить? Вы пытаетесь обнаружить какие-либо изменения в системном времени? Вы пытаетесь не позволить им изменить время назад, чтобы обойти испытание временем?
Показать ещё 3 комментария
0

Это старая проблема. Я считаю, что вы ищете NTP (Network Time Protocol). Просмотрите http://time.gov/about.html, и вы можете найти общедоступный сервер, который даст вам стандартное время.

Кроме того, чтобы использовать NTP, вы можете посмотреть на это. Как запросить NTP-сервер с помощью С#?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню