Мне нужно разработать приложение, которое получает текущее время с NTP-сервера, но я не могу найти ни одного примера в приложении Windows 8 Store. Если я попытаюсь использовать обычный класс С#, это не сработает. Кто-нибудь знает, как это решить?
Получение времени с NTP-сервера с помощью C# в приложении Windows 8
comment
это не работает - слишком расплывчатое описание проблемы. Пожалуйста, отредактируйте свой вопрос, чтобы он был более конкретным.
- person Jon Skeet   schedule 10.04.2013
comment
возможный дубликат Как запросить NTP-сервер с помощью C#?
- person Nasreddine   schedule 30.06.2015
Ответы (3)
Я настоятельно рекомендую избегать парсинга строк на HTML-странице — небольшое изменение формата представления сломает ваше приложение.
На основе примера, приведенного в этом ответе, вот DatagramSocket для получения правильного объекта DateTime
:
DatagramSocket socket = new DatagramSocket();
socket.MessageReceived += socket_MessageReceived;
await socket.ConnectAsync(new HostName("time.windows.com"), "123");
using (DataWriter writer = new DataWriter(socket.OutputStream))
{
byte[] container = new byte[48];
container[0] = 0x1B;
writer.WriteBytes(container);
await writer.StoreAsync();
}
Когда сообщение получено, вы можете обработать входящий массив байтов через встроенный ридер:
void socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
{
using (DataReader reader = args.GetDataReader())
{
byte[] b = new byte[48];
reader.ReadBytes(b);
DateTime time = GetNetworkTime(b);
}
}
GetNetworkTime
почти такой же, как в примере, который я упомянул, с буфером, переданным в качестве одного из аргументов:
public static DateTime GetNetworkTime(byte[] rawData)
{
//Offset to get to the "Transmit Timestamp" field (time at which the reply
//departed the server for the client, in 64-bit timestamp format."
const byte serverReplyTime = 40;
//Get the seconds part
ulong intPart = BitConverter.ToUInt32(rawData, serverReplyTime);
//Get the seconds fraction
ulong fractPart = BitConverter.ToUInt32(rawData, serverReplyTime + 4);
//Convert From big-endian to little-endian
intPart = SwapEndianness(intPart);
fractPart = SwapEndianness(fractPart);
var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);
//**UTC** time
var networkDateTime = (new DateTime(1900, 1, 1)).AddMilliseconds((long)milliseconds);
return networkDateTime;
}
// stackoverflow.com/a/3294698/162671
static uint SwapEndianness(ulong x)
{
return (uint)(((x & 0x000000ff) << 24) +
((x & 0x0000ff00) << 8) +
((x & 0x00ff0000) >> 8) +
((x & 0xff000000) >> 24));
}
person
Den Delimarsky
schedule
05.05.2013
Я думаю, это то, что вы хотите.
using System.Net;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
private async Task<DateTime?> GetNistTime()
{
DateTime? dateTime = null;
HttpClient httpClient = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, new Uri("http://nist.time.gov/timezone.cgi?UTC/s/0"));
HttpResponseMessage httpResponseMessage = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
string text = await httpResponseMessage.Content.ReadAsStringAsync();
if (httpResponseMessage.StatusCode == HttpStatusCode.OK)
{
string html = await httpResponseMessage.Content.ReadAsStringAsync();
string time = Regex.Match(html, @">\d+:\d+:\d+<").Value; //HH:mm:ss format
string date = Regex.Match(html, @">\w+,\s\w+\s\d+,\s\d+<").Value; //dddd, MMMM dd, yyyy
dateTime = DateTime.Parse((date + " " + time).Replace(">", "").Replace("<", ""));
}
return dateTime;
}
person
Farhan Ghumra
schedule
10.04.2013
HttpClient
имеет GetStringAsync
- нет необходимости в накладных расходах HttpRequestMessage
/HttpResponseMessage
. Помимо этого, прямой синтаксический анализ строк обязательно вызовет проблемы в долгосрочной перспективе, когда структура страницы изменится.
- person Den Delimarsky; 06.05.2013
Вам нужен StreamSocket, а затем самостоятельно реализовать протокол NTP. Если у вас есть класс NTP C# для классической Windows, вы можете адаптировать код для использования StreamSocket.
person
Prof. Falken
schedule
11.04.2013