zoukankan      html  css  js  c++  java
  • 随便找个网站获取格林威治时间, 并转换到北京时间


    uses Winapi.msxml, System.DateUtils;
    
    //实时获取网络时间的函数, 得到的是格林威治时间; 默认从 sohu 服务器获取, 因为它最快, 平均只需 15 毫秒
    function GetNetTime(aUrl: WideString = 'http://www.sohu.com'): string;
    begin
      with CoXMLHTTP.Create do
      begin
        open('Post', aUrl, False, EmptyParam, EmptyParam);
        send(EmptyParam);
        Result := getResponseHeader('Date');
      end;
    end;
    
    //格林威治时间(字符串)转换到北京时间
    function GMT2BjDateTime(const GMT: string): TDateTime;
    var
      A: TArray<string>;
    begin
      A := GMT.Split([',', ' '], ExcludeEmpty); //XE4 支持
    
      with TStringList.Create do begin
        CommaText := 'Jan=1,Feb=2,Mar=3,Apr=4,May=5,Jun=6,Jul=7,Aug=8,Sep=9,Oct=10,Nov=11,Dec=12';
        A[2] := Values[A[2]];
        Free;
      end;
    
      Result := StrToDateTime(Format('%s/%s/%s %s', [A[3], A[2], A[1], A[4]]), FormatSettings.Create(2052));
      Result := Result + 8/24; //换算成北京时间
    end;
    
    //测试
    procedure TForm1.Button1Click(Sender: TObject);
    var
      strGMT: string;
      bjDateTime: TDateTime;
    begin
      strGMT := GetNetTime();
      bjDateTime := GMT2BjDateTime(strGMT);
    
      ShowMessageFmt('%s'#13#10'%s', [strGMT, DateTimeToStr(bjDateTime)]);
    end;
    


    在真正实用中, 我把 GMT2BjDateTime 函数换成了:

    function GMT2BjDateTime(const GMT: string): TDateTime;
    var
      A: TArray<string>;
      Y,M,D,H,N,S: Word;
    begin
      A := GMT.Split([',', ' ', ':'], ExcludeEmpty);
    
      with TStringList.Create do begin
        CommaText := 'Jan=1,Feb=2,Mar=3,Apr=4,May=5,Jun=6,Jul=7,Aug=8,Sep=9,Oct=10,Nov=11,Dec=12';
        A[2] := Values[A[2]];
        Free;
      end;
    
      Y := StrToIntDef(A[3], YearOf(Now));
      M := StrToIntDef(A[2], MonthOf(Now));
      D := StrToIntDef(A[1], DayOf(Now));
      H := StrToIntDef(A[4], HourOf(Now));
      N := StrToIntDef(A[5], MinuteOf(Now));
      S := StrToIntDef(A[6], SecondOf(Now));
    
      Result := EncodeDateTime(Y, M , D, H, N, S, 0);
      Result := Result + 8/24; //换算成北京时间
    end;
    

  • 相关阅读:
    在一台Linux服务器上安装多个MySQL实例(二)--使用单独的MySQL配置文件
    在一台Linux服务器上安装多个MySQL实例(一)--使用mysqld_multi方式
    MySQL复制(四)--多源(主)复制
    MySQL复制(三)--基于全局事物标识符(GTID)配置复制
    类加载机制详解
    字符串常量池理解
    JVM内存模型
    Java设计模式之单例模式
    forkjoin及其性能分析,是否比for循环快?
    集合排序Comparable和Comparator有什么区别?
  • 原文地址:https://www.cnblogs.com/del/p/3263774.html
Copyright © 2011-2022 走看看