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;
    

  • 相关阅读:
    设计模式之观察者模式
    设计模式之外观模式
    设计模式之模板模式
    设计模式之装饰器模式
    设计模式之代理模式
    .NET常见问题汇总
    使用位运算计算两个整数的加减
    一个程序判断CPU是大端还是小端
    后缀表达式 转 表达式树
    实习一个月的小结
  • 原文地址:https://www.cnblogs.com/m0488/p/3380148.html
Copyright © 2011-2022 走看看