• 阅读RFC868Time Protocol时间协议


    阅读协议:Time Protocol时间协议

    协议地址:http://www.faqs.org/rfcs/rfc868.html,英文

    Time Protocol时间协议(此描述来源于http://www.csna.cn/
      该协议提供了一个独立于站点的,机器可读的日期和时间信息。时间服务返回的是
    以秒数,是从1900年1月1日午夜到现在的秒数。设计这个协议的一个重要目的在于,网
    络上的许多主机并没有时间的观念,在分布式的系统上,我们可以想一想,北京的时间
    和东京的时间如何分呢?主机的时间往往可以人为改变,而且因为机器时钟内的误差而
    变得不一致,因此需要使用时间服务器通过选举方式得到网络时间,让服务器有一个准
    确的时间观念。不要小看时间,这对于一些以时间为标准的分布运行的程序简单是太重
    要了。这个协议可以工作在TCP和UDP协议下。时间是由32位表示的,是自1900年1月1日
    0时到当前的秒数,我们可以计算一下,这个协议只能表示到2036年就不能用了,但是
    我们也知道计算机发展速度这么快,到时候可能就会有更好的协议代替这个协议。

    +++++++++++++++++++++++++++++++++++++++++++++++++++++

    根据协议最后一段:

    For example:

       the time  2,208,988,800 corresponds to 00:00  1 Jan 1970 GMT,

                 2,398,291,200 corresponds to 00:00  1 Jan 1976 GMT,

                 2,524,521,600 corresponds to 00:00  1 Jan 1980 GMT,

                 2,629,584,000 corresponds to 00:00  1 May 1983 GMT,

            and -1,297,728,000 corresponds to 00:00 17 Nov 1858 GMT.

    这里我实现下如何得到上述例子的数据2,208,988,800 之类的秒数。

    实现平台:winxp+vs2003

    语言:c/c++

    必要头文件:

    #include <iostream>
    #include <tchar.h>
    #include <windows.h>
    #include <stdio.h>

    前两个是Console需要的,后两个是自己添加的。

    代码如下:(方便拷贝,直接贴码,代码简单就不注释了)

    void MySetTime(unsigned long ulTime)
    {
     FILETIME ft;
     SYSTEMTIME st;
     
     st.wYear = 1900;
     st.wMonth = 1;
     st.wDay = 1;
     st.wHour = 0;
     st.wMinute = 0;
     st.wSecond = 0;
     st.wMilliseconds = 0;
     
     SystemTimeToFileTime(&st, &ft);
     LARGE_INTEGER li = *(LARGE_INTEGER*)&ft;
     li.QuadPart += (LONGLONG)10000000 * ulTime;
     ft = *(FILETIME*)&li;
     FileTimeToSystemTime(&ft, &st); 
     SetSystemTime(&st);
    }

    unsigned long GetLocalSystemTime()
    {
     unsigned long ulTime = 0;

     FILETIME ft;
     SYSTEMTIME st; 
     st.wYear = 1900;
     st.wMonth = 1;
     st.wDay = 1;
     st.wHour = 0;
     st.wMinute = 0;
     st.wSecond = 0;
     st.wMilliseconds = 0;
     SystemTimeToFileTime(&st, &ft);
     LARGE_INTEGER li = *(LARGE_INTEGER*)&ft;

     FILETIME ft_current;
     SYSTEMTIME current;
     GetSystemTime(&current); 
     SystemTimeToFileTime(&current, &ft_current);
     LARGE_INTEGER li_current = *(LARGE_INTEGER*)&ft_current;

     LONGLONG temp = li_current.QuadPart - li.QuadPart;
     temp = temp / 10000000;

     ulTime = (unsigned long)(temp);

     return ulTime;
    }

    unsigned long GetLocalSystemTime(SYSTEMTIME current)
    {
     unsigned long ulTime = 0;

     FILETIME ft;
     SYSTEMTIME st; 
     st.wYear = 1900;
     st.wMonth = 1;
     st.wDay = 1;
     st.wHour = 0;
     st.wMinute = 0;
     st.wSecond = 0;
     st.wMilliseconds = 0;
     SystemTimeToFileTime(&st, &ft);
     LARGE_INTEGER li = *(LARGE_INTEGER*)&ft;

     FILETIME ft_current;

     SystemTimeToFileTime(&current, &ft_current);
     LARGE_INTEGER li_current = *(LARGE_INTEGER*)&ft_current;

     LONGLONG temp = li_current.QuadPart - li.QuadPart;
     temp = temp / 10000000;

     ulTime = (unsigned long)(temp);

     return ulTime;
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
     unsigned long t = GetLocalSystemTime();
     printf("%u\t\n" ,t);

     SYSTEMTIME current;
     current.wYear = 1970;
     current.wMonth = 1;
     current.wDay = 1;
     current.wHour = 0;
     current.wMinute = 0;
     current.wSecond = 0;
     current.wMilliseconds = 0;

     t = GetLocalSystemTime(current);
     printf("%u\t\n" ,t);

     int into;
     scanf("%d" ,&into);

     return 0;
    }

    运行结果如下:

    测试运行结果:2,208,988,800 

  • 相关阅读:
    洛谷 P3391文艺平衡树 【fhq_treap】
    食物链(转自yekehe2002大神)
    TX
    黑匣子——KEY
    Splay初学习
    BZOJ2330_糖果_KEY
    BZOJ3224_普通平衡树_KEY
    BZOJ2730_矿场搭建_KEY
    BZOJ1452_Count_KEY
    初识主席树_Prefix XOR
  • 原文地址:https://www.cnblogs.com/GoGoagg/p/1448880.html
Copyright © 2020-2023  润新知