分享

delphi XE内置时区功能的Unix系统时间格式与delphi系统时间格式的互转

 npkaida 2020-04-30

一、不带毫秒的日期时间类型

直接用系统自带的即可:

uses System.DateUtils, System.StrUtils;

  ///<remarks>AValueUnix13Bit或delphi原生的10位AValue调用函数UnixBitToDateTime,
    ///AReturnUTC:均应设置-false,否则默认的UTC全世界同一时间与你有时差,
    ///只有世界集会公告等场景时才以AReturnUTC=True传入  </remarks>

function DateTimeToUnix(const AValue: TDateTime; AInputIsUTC: Boolean = True): Int64;

  ///<remarks>AValueUnix13Bit或delphi原生的10位AValue调用函数UnixBitToDateTime,
    ///AReturnUTC:均应设置-false,否则默认的UTC全世界同一时间与你有时差,
    ///只有世界集会公告等场景时才以AReturnUTC=True传入  </remarks>
function UnixToDateTime(const AValue: Int64; AReturnUTC: Boolean = True): TDateTime;
 

二、带毫秒的日期时间类型

代码如下:

{$IFDEF MSWINDOWS}
  SetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, 'yyyy-MM-dd');
{$ENDIF MSWINDOWS}
  // 设定程序本身所使用的日期时间格式: 毫秒格式符.ms
  with FormatSettings do
  begin
    ShortDateFormat := 'yyyy-mm-dd';
    LongDateFormat := 'yyyy-mm-dd';
    ShortTimeFormat := 'hh:nn:ss';
    LongTimeFormat := 'hh:nn:ss.zzz'; //长时间: 毫秒.ms
    //LongTimeFormat := 'hh:nn:ss.ms'; //长时间: 毫秒.ms
    DateSeparator := '-';
    TimeSeparator := ':';
  end;


///<summary>将带毫秒格式长时间格式的日期时间类型转化为Unix下13位表达的Int64整数:</summary>
  ///<param name="ADateTime">:带毫秒格式长时间格式的日期时间类型:前提需要事先设置好全局FormatSettings记录的格式</param>
  ///<returns>Unix下13位表达的Int64整数</returns> 
  ///<remarks>AValueUnix13Bit或delphi原生的10位AValue调用函数UnixBitToDateTime,
    ///AReturnUTC:均应设置-false,否则默认的UTC全世界同一时间与你有时差,
    ///只有世界集会公告等场景时才以AReturnUTC=True传入  </remarks>
function DateTimeToUnix13Bit(const ADateTime:TDateTime; AReturnUTC: Boolean = True):Int64;
begin
  Result:=
    DateTimeToUnix(StrToDatetime(FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz',ADateTime)),AReturnUTC)*1000
    +(
        DateTimeToMilliseconds(StrToDatetime(FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz',ADateTime)))
       -DateTimeToMilliseconds(StrToDatetime(FormatDateTime('yyyy-mm-dd hh:nn:ss',ADateTime)))
     );
end;

///<summary>将为Unix下13位表达的Int64整数转化位带毫秒格式长时间格式的日期时间类型的字符串:</summary>
  ///<param name="AValueUnix13Bit">:Unix下13位表达的Int64:前提需要事先设置好全局FormatSettings记录的格式</param>
  ///<returns>返回带毫秒长时间格式的日期时间字符串</returns> 
  ///<remarks>AValueUnix13Bit或delphi原生的10位AValue调用函数UnixBitToDateTime,
    ///AReturnUTC:均应设置-false,否则默认的UTC全世界同一时间与你有时差,
    ///只有世界集会公告等场景时才以AReturnUTC=True传入  </remarks>
function Unix13BitToDateTimeStr(const AValueUnix13Bit: Int64; AReturnUTC: Boolean = True): string;
begin
  Result:=
    FormatDateTime('yyyy-mm-dd hh:nn:ss',
      UnixToDateTime(
        AValueUnix13Bit.ToString.Substring(
          0,Length(AValueUnix13Bit.ToString)-3  ).ToInt64 ,AReturnUTC )
      )
    +'.'+
    (AValueUnix13Bit.ToString.Substring(
      Length(AValueUnix13Bit.ToString)-3,Length(AValueUnix13Bit.ToString)  ));
end;

///<summary>将为Unix下13位表达的Int64整数转化位带毫秒格式长时间格式的日期时间类型:</summary>
  ///<param name="AValueUnix13Bit">:Unix下13位表达的Int64:前提需要事先设置好全局FormatSettings记录的格式</param>
  ///<returns>返回带毫秒长时间格式的日期时间类型</returns> 
  ///<remarks>AValueUnix13Bit或delphi原生的10位AValue调用函数UnixBitToDateTime,
    ///AReturnUTC:均应设置-false,否则默认的UTC全世界同一时间与你有时差,
    ///只有世界集会公告等场景时才以AReturnUTC=True传入  </remarks>
function Unix13BitToDateTime(const AValueUnix13Bit: Int64; AReturnUTC: Boolean = True): TDateTime;
begin
  Result:=
    StrToDateTime(
      FormatDateTime('yyyy-mm-dd hh:nn:ss',
        UnixToDateTime(
          AValueUnix13Bit.ToString.Substring(
            0,Length(AValueUnix13Bit.ToString)-3  ).ToInt64 ,AReturnUTC )
        )
      +'.'+
      (AValueUnix13Bit.ToString.Substring(
        Length(AValueUnix13Bit.ToString)-3,Length(AValueUnix13Bit.ToString)  ))
    );
end;

三、调用示例:

var LUnix13BitInt64,LUnix10BitInt64:string ;

begin

    //{//在Unix下时间截整数(IOS及Android下):uses System.DateUtils;
    LUnix10BitInt64
    :=UIntToStr(
      DateTimeToUnix(now,false) );
    Memo1.Lines.Add(LUnix10BitInt64 );
    Memo1.Lines.Add(
      FormatDateTime('yyyy-mm-dd hh:nn:ss',
        UnixToDateTime(LUnix10BitInt64.ToInt64,false)
      )
    );
      //:返回10位整数的时间截:常用的
    LUnix13BitInt64
    :=UIntToStr(
      DateTimeToUnix13Bit(now,false) );
    Memo1.Lines.Add(LUnix13BitInt64);
       //:返回13位Unix整数:代表存入Unix时用的带毫秒的日期时间格式
    Memo1.Lines.Add(Unix13BitToDateTimeStr(LUnix13BitInt64.ToInt64,false));
       //:写入13位整数的时间截:往Unix下写入或从手机媒体文件名等读取结果的时候用

end;

喜欢的话,就在下面点个赞、收藏就好了,方便看下次的分享:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多