PDA

View Full Version : سوال: گرفتن ساعت از جایی دیگر به جز سیستم



forodo
پنج شنبه 14 آذر 1392, 09:33 صبح
سلام
من می خوام ساعت رو از جایی که کاملاً مطمئن هست و هیچ کس نمی تواند آن را تغییر دهم بدست آورم.
از کجا باید این ساعت را بگیرم؟
با تشکر

hamid_hr
پنج شنبه 14 آذر 1392, 09:56 صبح
بايد از سرور هايي كه ساعت و تاريخو ميدن بگيري و به ساعت محلي تبديل كني تهران +3:30
http://stackoverflow.com/questions/1193955/how-to-query-an-ntp-server-using-c

forodo
پنج شنبه 14 آذر 1392, 10:14 صبح
من کدارو متوجه نمیشم تا به اون چیزی که می خوام برسم.
1- اون 3:30+ رو کجا باید بزنم؟ الان همین لینکی که شما دادید رو اجرا کردم ساعت درست رو بهم داد.
2- من می خوام ساعت مثلاً 14:25:26 باشه که می دونم باید اینجوری بنویسم datetime.now.tostring(HH:mm:ss) ولی نمی دونم این رو کجا باید بذارم.
3- قسمتی که تاریخ رو می ده کدام قسمتش هست چون می خوام به شمسی تبدیلش کنم. البته می تونم جواب رو split کنم و تاریخ رو دربیارم و به شمسی تبدیلش کنم ولی می خوام بدونم کدوم قسمت کد برای تاریخ هستش.
با تشکر
جواب کد پایین اینه:

12/5/2013 10:58:15 AM


public static DateTime GetNetworkTime()
{
//default Windows time server
const string ntpServer = "time.windows.com";

// NTP message size - 16 bytes of the digest (RFC 2030)
var ntpData = new byte[48];

//Setting the Leap Indicator, Version Number and Mode values
ntpData[0] = 0x1B; //LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (Client Mode)

var addresses = System.Net.Dns.GetHostEntry(ntpServer).AddressList ;

//The UDP port number assigned to NTP is 123
var ipEndPoint = new System.Net.IPEndPoint(addresses[0], 123);
//NTP uses UDP
var socket = new System.Net.Sockets.Socket(System.Net.Sockets.Addre ssFamily.InterNetwork, System.Net.Sockets.SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp);

socket.Connect(ipEndPoint);

socket.Send(ntpData);
socket.Receive(ntpData);
socket.Close();

//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(ntpData, serverReplyTime);

//Get the seconds fraction
ulong fractPart = BitConverter.ToUInt32(ntpData, 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, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds((long)milliseco nds);

return networkDateTime.ToLocalTime();
}

// stackoverflow.com/a/3294698/162671
static uint SwapEndianness(ulong x)
{
return (uint)(((x & 0x000000ff) << 24) +
((x & 0x0000ff00) << 8) +
((x & 0x00ff0000) >> 8) +
((x & 0xff000000) >> 24));
}