亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sdateutils.pas

?? AlphaControls是一個Delphi標準控件的集合
?? PAS
字號:
unit sDateUtils;
{$I sDefs.inc}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, sConst, ExtCtrls, sUtils;

const
  NullDate: TDateTime = 0;

function FirstDayOfCurrMonth(D : TDateTime) : TDateTime;
function LastDayOfPrMonth(D : TDateTime) : TDateTime;
function GetKvartal(Value : TDateTime) : integer;
function DaysPerMonth(AYear, AMonth: Integer): Integer;
function ExtractDay(ADate: TDateTime): Word;
function ExtractMonth(ADate: TDateTime): Word;
function ExtractYear(ADate: TDateTime): Word;
function DefDateFormat(NormalYears: Boolean): string;
function GetDateOrder(const DateFormat: string): TDateOrder;
function DefDateMask(BlanksChar: Char; NormalYears: Boolean): string;
function ValidDate(ADate: TDateTime): Boolean;
function IsValidDate(Y, M, D: Word): Boolean;
function InternalStrToDate(const DateFormat, S: string; var Date: TDateTime): Boolean;
function ScanDateStr(const Format, S: string; var D, M, Y: Integer): Boolean;
procedure ExtractMask(const Format, S: string; Ch: Char; Cnt: Integer; var I: Integer; Blank, Default: Integer);
function CurrentYear: Word;
function ExpandYear(Year: Integer): Integer;
function ScanDate(const S, DateFormat: string; var Pos: Integer; var Y, M, D: Integer): Boolean;
function MonthFromName(const S: string; MaxLen: Byte): Byte;
// from SYSUTILS.PAS
function ScanNumber(const S: string; MaxLength: Integer; var Pos: Integer; var Number: Longint): Boolean;
function ScanChar(const S: string; var Pos: Integer; Ch: Char): Boolean;
procedure ScanBlanks(const S: string; var Pos: Integer);

var

  NormalYears : boolean;
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

implementation

function GetKvartal(Value : TDateTime) : integer;
var
  i : integer;
begin
  i := ExtractMonth(Value);
  Result := ((i-1) div 3) + 1;
end;

function FirstDayOfCurrMonth(D : TDateTime) : TDateTime;
var
  Year, Month, Day: Word;
begin
  DecodeDate(D, Year, Month, Day);
  Day := 1;
  Result := EncodeDate(Year, Month, Day);
end;

function LastDayOfPrMonth(D : TDateTime) : TDateTime;
begin
  Result := FirstDayOfCurrMonth(D) - 1;
end;

function DaysPerMonth(AYear, AMonth: Integer): Integer;
const
  DaysInMonth: array[1..12] of Integer = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
begin
  Result := DaysInMonth[AMonth];
  if (AMonth = 2) and IsLeapYear(AYear) then Inc(Result); { leap-year Feb is special }
end;

function ExtractDay(ADate: TDateTime): Word;
var
  M, Y: Word;
begin
  DecodeDate(ADate, Y, M, Result);
end;

function ExtractMonth(ADate: TDateTime): Word;
var
  D, Y: Word;
begin
  DecodeDate(ADate, Y, Result, D);
end;

function ExtractYear(ADate: TDateTime): Word;
var
  D, M: Word;
begin
  DecodeDate(ADate, Result, M, D);
end;

function DefDateFormat(NormalYears: Boolean): string;
begin
  if NormalYears then begin
    case GetDateOrder(ShortDateFormat) of
      doMDY: Result := 'MM/DD/YYYY';
      doDMY: Result := 'DD/MM/YYYY';
      doYMD: Result := 'YYYY/MM/DD';
    end;
  end
  else begin
    case GetDateOrder(ShortDateFormat) of
      doMDY: Result := 'MM/DD/YY';
      doDMY: Result := 'DD/MM/YY';
      doYMD: Result := 'YY/MM/DD';
    end;
  end;
end;

function GetDateOrder(const DateFormat: string): TDateOrder;
var
  I: Integer;
begin
  Result := doDMY;
  I := 1;
  while I <= Length(DateFormat) do begin
    case Chr(Ord(DateFormat[I]) and $DF) of
      'Y': Result := doYMD;
      'M': Result := doMDY;
      'D': Result := doDMY;
    else
      Inc(I);
      Continue;
    end;
    Exit;
  end;
  Result := doDMY;
end;

function DefDateMask(BlanksChar: Char; NormalYears: Boolean): string;
begin
  if NormalYears then begin
    case GetDateOrder(ShortDateFormat) of
      doMDY, doDMY: Result := '!99/99/9999;1;';
      doYMD: Result := '!9999/99/99;1;';
    end;
  end
  else begin
    case GetDateOrder(ShortDateFormat) of
      doMDY, doDMY: Result := '!99/99/99;1;';
      doYMD: Result := '!99/99/99;1;';
    end;
  end;
  if Result <> '' then Result := Result + BlanksChar;
end;

function ValidDate(ADate: TDateTime): Boolean;
var
  Year, Month, Day: Word;
begin
  try
    DecodeDate(ADate, Year, Month, Day);
    Result := IsValidDate(Year, Month, Day);
  except
    Result := False;
  end;
end;

function IsValidDate(Y, M, D: Word): Boolean;
begin
  Result := (Y >= 1) and (Y <= 9999) and (M >= 1) and (M <= 12) and
    (D >= 1) and (D <= DaysPerMonth(Y, M));
end;

function InternalStrToDate(const DateFormat, S: string; var Date: TDateTime): Boolean;
var
  D, M, Y: Integer;
begin
  if S = '' then begin
    Date := NullDate;
    Result := True;
  end
  else begin
    Result := ScanDateStr(DateFormat, S, D, M, Y);
    if Result then
    try
      Date := EncodeDate(Y, M, D);
    except
      Result := False;
    end;
  end;
end;

function ScanDateStr(const Format, S: string; var D, M, Y: Integer): Boolean;
var
  Pos: Integer;
begin
  ExtractMask(Format, S, 'm', 3, M, -1, 0); { short month name? }
  if M = 0 then ExtractMask(Format, S, 'm', 1, M, -1, 0);
  ExtractMask(Format, S, 'd', 1, D, -1, 1);
  ExtractMask(Format, S, 'y', 1, Y, -1, CurrentYear);
  Y := ExpandYear(Y);
  Result := (M > 0) and (D > 0) and IsValidDate(Y, M, D);
  if not Result then begin
    Pos := 1;
    Result := ScanDate(S, Format, Pos, Y, M, D);
  end;
end;

procedure ExtractMask(const Format, S: string; Ch: Char; Cnt: Integer; var I: Integer; Blank, Default: Integer);
var
  Tmp: string[20];
  J, L: Integer;
  ix : integer;
begin
  I := Default;
//  J := 0;
  Ch := UpCase(Ch);
  L := Length(Format);
  if Length(S) < L then L := Length(S)
  else if Length(S) > L then Exit;
  J := Pos(MakeStr(Ch, Cnt), AnsiUpperCase(Format));
  if J <= 0 then Exit;
  Tmp := '';
  ix := Length(Format);
  if not((ix < Cnt) or (ix < J)) then
    while ix < 20 do begin
      if (ix < J) then break;
      if not ((UpCase(Format[J]) = Ch) and (J <= L)) then break;
      if S[J] <> ' ' then Tmp := Tmp + S[J];
      Inc(J);
    end;
{
  while (UpCase(Format[J]) = Ch) and (J <= L) do begin
    if S[J] <> ' ' then Tmp := Tmp + S[J];
    Inc(J);
    if
    if Length(Tmp) > 19 then break;
  end;
}  
  if Tmp = '' then I := Blank
  else if Cnt > 1 then begin
    I := MonthFromName(Tmp, Length(Tmp));
    if I = 0 then I := -1;
  end
  else I := StrToIntDef(Tmp, -1);
end;

function CurrentYear: Word;
var
  SystemTime: TSystemTime;
begin
  GetLocalTime(SystemTime);
  Result := SystemTime.wYear;
end;

function ExpandYear(Year: Integer): Integer;
var
  N: Longint;
begin
  Result := Year;
  if Result < 100 then begin
    N := CurrentYear - 60;
    Inc(Result, N div 100 * 100);
    if Result < N then
      Inc(Result, 100);
  end;
end;

function ScanDate(const S, DateFormat: string; var Pos: Integer; var Y, M, D: Integer): Boolean;
var
  DateOrder: TDateOrder;
  N1, N2, N3: Longint;
begin
  Result := False;
  Y := 0; M := 0; D := 0;
  DateOrder := GetDateOrder(DateFormat);
  if not (ScanNumber(S, MaxInt, Pos, N1) and ScanChar(S, Pos, DateSeparator) and
    ScanNumber(S, MaxInt, Pos, N2)) then Exit;
  if ScanChar(S, Pos, DateSeparator) then begin
    if not ScanNumber(S, MaxInt, Pos, N3) then Exit;
    case DateOrder of
      doMDY: begin Y := N3; M := N1; D := N2; end;
      doDMY: begin Y := N3; M := N2; D := N1; end;
      doYMD: begin Y := N1; M := N2; D := N3; end;
    end;
    Y := ExpandYear(Y);
  end
  else begin
    Y := CurrentYear;
    if DateOrder = doDMY then begin
      D := N1; M := N2;
    end
    else begin
      M := N1; D := N2;
    end;
  end;
  ScanChar(S, Pos, DateSeparator);
  ScanBlanks(S, Pos);
  Result := IsValidDate(Y, M, D) and (Pos > Length(S));
end;

function MonthFromName(const S: string; MaxLen: Byte): Byte;
begin
  if Length(S) > 0 then
    for Result := 1 to 12 do begin
      if (Length(LongMonthNames[Result]) > 0) and
        (AnsiCompareText(Copy(S, 1, MaxLen),
        Copy(LongMonthNames[Result], 1, MaxLen)) = 0) then Exit;
    end;
  Result := 0;
end;

function ScanNumber(const S: string; MaxLength: Integer; var Pos: Integer; var Number: Longint): Boolean;
var
  I: Integer;
  N: Word;
begin
  Result := False;
  ScanBlanks(S, Pos);
  I := Pos;
  N := 0;
  while (I <= Length(S)) and (Longint(I - Pos) < MaxLength) and
    (S[I] in ['0'..'9']) and (N < 1000) do
  begin
    N := N * 10 + (Ord(S[I]) - Ord('0'));
    Inc(I);
  end;
  if I > Pos then begin
    Pos := I;
    Number := N;
    Result := True;
  end;
end;

function ScanChar(const S: string; var Pos: Integer; Ch: Char): Boolean;
begin
  Result := False;
  ScanBlanks(S, Pos);
  if (Pos <= Length(S)) and (S[Pos] = Ch) then begin
    Inc(Pos);
    Result := True;
  end;
end;

procedure ScanBlanks(const S: string; var Pos: Integer);
var
  I: Integer;
begin
  I := Pos;
  while (I <= Length(S)) and (S[I] = ' ') do Inc(I);
  Pos := I;
end;
initialization
  NormalYears := Pos('YYYY', AnsiUpperCase(ShortDateFormat)) > 0;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本女人一区二区三区| 极品瑜伽女神91| 国产欧美一区二区精品性| 91麻豆精品久久久久蜜臀| 欧美自拍偷拍一区| 欧美偷拍一区二区| 欧美日韩精品一区视频| 欧美精品免费视频| 日韩精品一区在线| 久久久久久久久久看片| 国产精品久久久久久久久晋中| 中文字幕的久久| 成人欧美一区二区三区黑人麻豆| 亚洲人成在线播放网站岛国| 一区二区三区国产| 石原莉奈一区二区三区在线观看| 免费高清在线视频一区·| 国产一区二区三区日韩| eeuss鲁片一区二区三区在线看| 一本到一区二区三区| 欧美人牲a欧美精品| 精品久久国产字幕高潮| 国产精品国产三级国产| 亚洲午夜久久久久久久久电影网 | 国产成人精品亚洲午夜麻豆| 北条麻妃一区二区三区| 欧美日韩国产成人在线91 | 国产一区999| 色视频欧美一区二区三区| 欧美精品777| 国产精品国产自产拍高清av王其| 亚洲在线观看免费| 国产一区不卡在线| 欧美三区在线视频| 国产欧美日韩激情| 日韩精品亚洲一区二区三区免费| 国产毛片精品视频| 欧美性大战xxxxx久久久| 精品美女在线观看| 亚洲成人一二三| 成人国产精品免费| 91精品国产综合久久蜜臀| 国产精品天美传媒沈樵| 日韩不卡一区二区三区| 色综合天天综合色综合av | 久久国产免费看| 色国产精品一区在线观看| 日韩一区二区三区视频在线| 亚洲欧洲三级电影| 国产麻豆精品95视频| 欧美丰满美乳xxx高潮www| 中文字幕一区在线观看| 丁香婷婷综合网| 欧美日韩精品一区二区三区蜜桃| 国产精品嫩草影院com| 狠狠v欧美v日韩v亚洲ⅴ| 欧美三级日韩在线| 亚洲久草在线视频| 国产精品一区三区| 精品捆绑美女sm三区| 污片在线观看一区二区| 99久精品国产| 中文字幕日韩av资源站| 国产精品一区二区免费不卡| 91精品国产综合久久福利软件 | 欧美妇女性影城| 亚洲亚洲精品在线观看| 一本大道av伊人久久综合| 国产精品无圣光一区二区| 国产精品一二三| 精品国产sm最大网站免费看| 蜜桃久久精品一区二区| 91精品婷婷国产综合久久| 视频一区二区不卡| 日韩午夜在线观看视频| 蜜桃视频在线一区| 日韩一区二区视频在线观看| 久久国产精品免费| 久久久一区二区三区捆绑**| 精品写真视频在线观看| 精品国产a毛片| 成人自拍视频在线| 国产精品久久久久aaaa樱花| caoporm超碰国产精品| 国产精品夫妻自拍| 在线精品亚洲一区二区不卡| 午夜精品福利一区二区蜜股av | 精品一区二区三区久久| 久久蜜桃一区二区| 处破女av一区二区| 一区二区三区电影在线播| 欧美日韩一卡二卡三卡| 日本强好片久久久久久aaa| 日韩精品一区二区三区老鸭窝| 久久99国产精品久久99果冻传媒| 精品少妇一区二区三区在线视频| 国产精品中文字幕日韩精品| 日本一区二区三区四区在线视频 | 日韩视频永久免费| 国产成人精品网址| 亚洲国产美女搞黄色| 欧美一区二区三区免费视频 | 日韩免费观看高清完整版在线观看| 久久成人18免费观看| 中文字幕精品在线不卡| 色94色欧美sute亚洲线路二| 老司机一区二区| 亚洲少妇屁股交4| 欧美一级在线视频| av亚洲精华国产精华精| 石原莉奈在线亚洲三区| 中文字幕欧美一| 日韩一级视频免费观看在线| 欧美日韩国产系列| 国产精品 日产精品 欧美精品| 亚洲女厕所小便bbb| 精品久久久久久久久久久久久久久 | 精品一区二区三区蜜桃| 日韩美女视频一区二区 | 欧美一级生活片| 97久久精品人人爽人人爽蜜臀| 日韩精品一级中文字幕精品视频免费观看 | 风间由美一区二区三区在线观看 | 亚洲女子a中天字幕| 日韩色在线观看| 在线欧美日韩国产| 丁香一区二区三区| 久久超碰97人人做人人爱| 一区二区三区四区国产精品| 久久夜色精品一区| 欧美一区二区三区免费视频| 欧美综合一区二区三区| av中文一区二区三区| 国产一区二区调教| 免费观看91视频大全| 亚洲va天堂va国产va久| 中文字幕在线观看不卡视频| 久久综合精品国产一区二区三区| 欧美疯狂做受xxxx富婆| 欧美伊人久久久久久午夜久久久久| 国产 欧美在线| 国产一级精品在线| 国产原创一区二区| 国内一区二区在线| 精彩视频一区二区三区| 蜜乳av一区二区| 秋霞av亚洲一区二区三| 日韩精品亚洲一区| 免费黄网站欧美| 久久精品99久久久| 蜜臀a∨国产成人精品| 日本欧美一区二区在线观看| 奇米777欧美一区二区| 日韩成人免费看| 极品少妇xxxx精品少妇偷拍| 精品制服美女丁香| 国产黄色91视频| 成人伦理片在线| 色婷婷久久99综合精品jk白丝| 色综合久久久久久久久| 色欧美日韩亚洲| 欧美老肥妇做.爰bbww| 日韩色在线观看| 亚洲国产精品av| 一区二区三区欧美日韩| 一区二区三区免费看视频| 亚洲国产中文字幕| 久久精品国产99国产| 国产ts人妖一区二区| 99在线精品一区二区三区| 色婷婷国产精品综合在线观看| 欧美日韩不卡在线| 2020国产精品| 亚洲视频在线一区| 亚洲6080在线| 国产成人午夜精品影院观看视频| 成人在线一区二区三区| 欧美亚洲一区三区| 精品伦理精品一区| 亚洲三级在线播放| 日韩av在线免费观看不卡| 国产在线不卡一卡二卡三卡四卡| 99久久免费视频.com| 欧美日韩成人综合天天影院| 久久色中文字幕| 亚洲美女在线国产| 激情欧美一区二区| 欧美在线制服丝袜| 久久综合九色综合97婷婷女人| 亚洲免费高清视频在线| 韩国欧美一区二区| 在线免费观看视频一区| 久久先锋影音av鲁色资源网| 亚洲精品免费在线| 激情av综合网| 欧美福利电影网| 成人免费一区二区三区在线观看| 蜜臀av性久久久久av蜜臀妖精| 91天堂素人约啪| 国产无一区二区|