Каков наилучший способ получить текущую дату? В настоящее время я сохраняю дату следующим образом:
string date = DateTime.Now.ToString("yyyyMMdd");
Очевидно, что если пользователь изменяет дату в своей системе, это также будет затронуто.
Мне нужен способ получить точную дату (желательно в центральное время) и сохранить ее как строку в моем приложении. Любые идеи?
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");
}
Определить "точную"? Если вы не можете доверять системной дате, вам нужно получить время от внешнего источника (т.е. Атомных часов). Но пользователь может заблокировать вашу программу от ее получения (т.е. Отключить сетевой кабель, блокируя ваш запрос времени с помощью программного брандмауэра).
Так что же вы действительно хотите?
Независимо от даты и времени, которое вы получаете локально, зависит от текущей точности системного времени. Если вы хотите независимого точного времени, вам нужно получить его извне из веб-службы времени, например Yahoo Server Time.
Так как пользователь может изменить время на биосе, вы не можете доверять тому, что компьютер будет точным.
Ваш единственный другой выбор требует наличия у них доступа к Интернету, затем вы можете позвонить в веб-сервис и позвонить, но если вы собираетесь быть параноиком и ограничить, насколько они знают, зашифруйте его с помощью RSA-шифрования, чтобы убедиться, что ваша служба дала дату.
Вы можете реализовать очень простой веб-сервис или RESTful-вызов на сервере, который обеспечит результат. Это будет работать до тех пор, пока вы доверяете правильности даты/времени сервера.
Если вам нужно зафиксировать текущее время и не хотите, чтобы его связывали с машиной, код работал с правильной установкой даты/времени, вы можете использовать NTP для извлечения текущего времени из сети (или Интернета)... предполагая, что машина активно подключена к одному.
Я считаю, что ВМС США поддерживают группу серверов NTP. Отъезд: http://tycho.usno.navy.mil/ntp.html
Если вам нужен супер-безопасный, очень устойчивый доступ к текущему времени, вам нужно будет иметь некоторый уровень контроля над оборудованием, на котором вы работаете. В конце концов, пользователи могут потянуть свой сетевой кабель, обмануть IP-адреса в сети, заблокировать порты и IP-адреса, изменить их файл HOSTS, всевозможные вещи, которые могут помешать сетевому запросу на время.
Всегда сохраняйте в UTC время - вы сэкономите на себе массу проблем позже. Сохраняйте в UTC и конвертируйте в любое местное время, в котором вы нуждаетесь, включая летнее время, в то время, когда оно вам понадобится для вашего расчета.
Кроме того, если время не должно быть человеком, читаемым в хранилище, вы можете сохранить его в Ticks как наименее подверженное ошибкам:
string ticks = DateTimeOffset.UtcNow.Ticks.ToString();
DateTimeOffset stampUtc = новый DateTimeOffset (long.Parse(ticks), TimeSpan.Zero);
DateTimeOffset stampLocal = stampUtc.ToLocalTime();
Это старая проблема. Я считаю, что вы ищете NTP (Network Time Protocol). Просмотрите http://time.gov/about.html, и вы можете найти общедоступный сервер, который даст вам стандартное время.
Кроме того, чтобы использовать NTP, вы можете посмотреть на это. Как запросить NTP-сервер с помощью С#?