3

Hi i am using below function from How to Query an NTP Server using C#? to get Time from Time server

public  DateTime _MGetNetworkTime()
{
    try
    {
        //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 = Dns.GetHostEntry(ntpServer).AddressList;

        //The UDP port number assigned to NTP is 123
        var ipEndPoint = new IPEndPoint(addresses[0], 123);
        //NTP uses UDP
        var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 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)milliseconds);

        return networkDateTime.ToLocalTime();
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
        return Convert.ToDateTime ("12-31-1900");
    }
}

uint SwapEndianness(ulong x)
{
    return (uint)(((x & 0x000000ff) << 24) +
                   ((x & 0x0000ff00) << 8) +
                   ((x & 0x00ff0000) >> 8) +
                   ((x & 0xff000000) >> 24));
}

above function is working but my Issue is :

it is not getting Indian time . suppose now time is 9:10 Pm function is setting 5:30 AM, Date is Correct ..

please guide me where I am Wrong ..

Thanks

UPDATE :

I am setting a Date Time Veritable for example DateTime a = _MGetNetworkTime(); with above code and passing values to other function which is below.

[StructLayout(LayoutKind.Sequential)]
        public struct SYSTEMTIME
        {
            public short wYear;
            public short wMonth;
            public short wDayOfWeek;
            public short wDay;
            public short wHour;
            public short wMinute;
            public short wSecond;
            public short wMilliseconds;
        }
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool SetSystemTime(ref SYSTEMTIME st);

        public  void _MSetSystemDate(short _pYear, short _pMonth, short _pDay, short _pHour = 0, short _pMinute = 0, short _pSecond = 0)
        {
            if (IsUserAdministrator())
            {
                SYSTEMTIME st = new SYSTEMTIME();
                st.wYear = _pYear; // must be short
                st.wMonth = _pMonth;
                st.wDay = _pDay;
                st.wHour = _pHour;
                st.wMinute = _pMinute;
                st.wSecond = _pSecond;
                SetSystemTime(ref st); // invoke this method.
            }
            else
            {
                MessageBox.Show("You have not Windows Administrator Access." + Environment.NewLine + "Please Login Windows with Addministrator Rights.");
            }
        }
Community
  • 1
  • 1
  • 1
    And what timezone is defined for your local machine? What is the value of networkDateTime? – Panagiotis Kanavos Dec 16 '13 at 15:54
  • My system Time Zone is (UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi – subhash bhule Dec 16 '13 at 15:56
  • 3
    Your questions really seems to be "Why might DateTime.ToLocalTime not give me the correct local time? Assuming that 'networkDateTime' is the correct UTC time (you have checked, haven't you?), then you would be much better to remove all the stuff about NTP and phrase the question like that. Of course, you also need to describe what you're doing with the return from this function, because it might be there that the problem lies. – Will Dean Dec 16 '13 at 15:57
  • 1
    The time element can't be equal to the timezone offset, unless some error caused the function to return 0 time (ie 00:00:00). Are you sure you aren't seeing the effects of your exception handler? – Panagiotis Kanavos Dec 16 '13 at 16:05
  • @PanagiotisKanavos no there is no error, when i use function my system date is set correctly but time is wrong – subhash bhule Dec 16 '13 at 16:07
  • [SetSystemDateTime](http://msdn.microsoft.com/en-us/library/windows/desktop/ms724942(v=vs.85).aspx) expects **UTC**. If you pass the results of GetNetworkTime, you are using **Local Time**. Why are you trying to do in C# what is accomplished by a system service anyway? – Panagiotis Kanavos Dec 16 '13 at 16:36

1 Answers1

1

I believe this should also work without any Internet Connection. Give it a try:

private static TimeZoneInfo INDIAN_ZONE = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time");
DateTime indianTime =  TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, INDIAN_ZONE);
  • This would "fix" the problem if the system's timezone is *NOT* already at +5:30 - in which case the answer would be "fix the system's timezone or don't use ToLocalTime()". BTW what does hardcoding the timezone have to do with getting the time from an NTP server? – Panagiotis Kanavos Dec 16 '13 at 16:32