cxdateutils.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,765 行 · 第 1/5 页

PAS
1,765
字号
    function GetMinSupportedYear: Integer; override;
  public
    constructor Create; override;
    destructor Destroy; override;

    function FromDateTime(ADate: TDateTime): TcxDateTime; overload; override;
    function GetFirstWeekDay: Byte; override;
    function GetWeekNumber(ADate: TcxDateTime; AStartOfWeek: TDay;
      AFirstWeekOfYear: TcxFirstWeekOfYear): Cardinal; overload; override;
    function GetDaysInMonth(AEra: Integer; AYear, AMonth: Cardinal): Cardinal; override;
    function GetDaysInYear(AEra: Integer; AYear: Cardinal): Cardinal; override;
    function GetFullWeeksInYear(AYear: Cardinal): Cardinal; override;
    function GetMonthsInYear(AEra: Integer; AYear: Cardinal): Cardinal; override;
    function IsLeapDay(AEra: Integer; AYear, AMonth, ADay: Cardinal): Boolean; override;
    function IsLeapMonth(AEra: Integer; AYear, AMonth: Cardinal): Boolean; override;
    function IsLeapYear(AEra: Integer; AYear: Cardinal): Boolean; override;
    function ToDateTime(ADateTime: TcxDateTime): TDateTime; overload; override;

    property GregorianCalendarType: TcxGregorianCalendarTableType read
      FGregorianCalendarType write FGregorianCalendarType;
  end;

  { TcxJapaneseCalendarTable }

  TcxJapaneseCalendarTable = class(TcxGregorianCalendarTable)
  protected
    function GetCalendarAlgorithmType: TcxCalendarAlgorithmType; override;
    function GetCalendarID: TcxCALID; override;
    function GetDefaultEra: TcxEra; override;
    function GetMaxSupportedDate: TDateTime; override;
    function GetMinSupportedDate: TDateTime; override;
    function GetMaxSupportedYear: Integer; override;
    function GetMinSupportedYear: Integer; override;
  public
    constructor Create; override;

    function FromDateTime(ADate: TDateTime): TcxDateTime; overload; override;
    function GetFirstWeekDay: Byte; override;
    function ToDateTime(ADateTime: TcxDateTime): TDateTime; overload; override;
  end;

  { TcxTaiwanCalendarTable }

  TcxTaiwanCalendarTable = class(TcxJapaneseCalendarTable)
  protected
    function GetCalendarAlgorithmType: TcxCalendarAlgorithmType; override;
    function GetCalendarID: TcxCALID; override;
    function GetDefaultEra: TcxEra; override;
    function GetMinSupportedDate: TDateTime; override;
    function GetMaxSupportedYear: Integer; override;
    function GetMinSupportedYear: Integer; override;
  public
    constructor Create; override;
  end;

  { TcxKoreanCalendarTable }

  TcxKoreanCalendarTable = class(TcxJapaneseCalendarTable)
  protected
    function GetCalendarAlgorithmType: TcxCalendarAlgorithmType; override;
    function GetCalendarID: TcxCALID; override;
    function GetDefaultEra: TcxEra; override;
    function GetMinSupportedDate: TDateTime; override;
    function GetMaxSupportedYear: Integer; override;
    function GetMinSupportedYear: Integer; override;
  public
    constructor Create; override;
  end;

  { TcxHijriCalendarTable }

  TcxHijriCalendarTable = class(TcxCustomCalendarTable)
  private
    FDefaultEra: TcxEra;
  protected
    function GetCalendarAlgorithmType: TcxCalendarAlgorithmType; override;
    function GetCalendarID: TcxCALID; override;
    function GetDefaultEra: TcxEra; override;
    function GetMaxSupportedDate: TDateTime; override;
    function GetMinSupportedDate: TDateTime; override;
    function GetMaxSupportedYear: Integer; override;
    function GetMinSupportedYear: Integer; override;
  public
    constructor Create; override;
    destructor Destroy; override;

    function FromDateTime(ADate: TDateTime): TcxDateTime; overload; override;
    function GetFirstWeekDay: Byte; override;
    function GetWeekNumber(ADate: TcxDateTime; AStartOfWeek: TDay;
      AFirstWeekOfYear: TcxFirstWeekOfYear): Cardinal; overload; override;
    function GetDaysInMonth(AEra: Integer; AYear, AMonth: Cardinal): Cardinal; override;
    function GetDaysInYear(AEra: Integer; AYear: Cardinal): Cardinal; override;
    function GetFullWeeksInYear(AYear: Cardinal): Cardinal; override;
    function GetMonthsInYear(AEra: Integer; AYear: Cardinal): Cardinal; override;
    function IsLeapDay(AEra: Integer; AYear, AMonth, ADay: Cardinal): Boolean; override;
    function IsLeapMonth(AEra: Integer; AYear, AMonth: Cardinal): Boolean; override;
    function IsLeapYear(AEra: Integer; AYear: Cardinal): Boolean; override;
    function ToDateTime(ADateTime: TcxDateTime): TDateTime; overload; override;

    function GetMonthNumber(AYear: Integer; const S: string): Integer; override;
  end;

  { TcxThaiCalendarTable }

  TcxThaiCalendarTable = class(TcxJapaneseCalendarTable)
  protected
    function GetCalendarAlgorithmType: TcxCalendarAlgorithmType; override;
    function GetCalendarID: TcxCALID; override;
    function GetDefaultEra: TcxEra; override;
    function GetMinSupportedDate: TDateTime; override;
    function GetMaxSupportedYear: Integer; override;
    function GetMinSupportedYear: Integer; override;
  public
    constructor Create; override;
  end;

  { TcxHebrewCalendar }

  TcxHebrewCalendarTableTypeYear = (hctyDeficient = 1, hctyNormal = 2, hctyPerfect = 3);

  TcxHebrewCalendarTable = class(TcxCustomCalendarTable)
  private
    FDefaultEra: TcxEra;
    function GetDayDifference(ALunarYearType, AMonth, ADay,
      ALunarMonth, ALunarDay: Integer): Integer;
    function HebrewNumber(const S: string): Integer;
    procedure GetLunarMonthDay(AYear: Integer; var ADate: TcxDate);
  protected
    function GetCalendarAlgorithmType: TcxCalendarAlgorithmType; override;
    function GetCalendarID: TcxCALID; override;
    function GetDefaultEra: TcxEra; override;
    function GetMaxSupportedDate: TDateTime; override;
    function GetMinSupportedDate: TDateTime; override;
    function GetMaxSupportedYear: Integer; override;
    function GetMinSupportedYear: Integer; override;
  public
    constructor Create; override;
    destructor Destroy; override;

    function FromDateTime(ADate: TDateTime): TcxDateTime; overload; override;
    function GetFirstWeekDay: Byte; override;
    function GetYearType(AYear: Cardinal): TcxHebrewCalendarTableTypeYear;
    function GetWeekNumber(ADate: TcxDateTime; AStartOfWeek: TDay;
      AFirstWeekOfYear: TcxFirstWeekOfYear): Cardinal; overload; override;
    function GetDaysInMonth(AEra: Integer; AYear, AMonth: Cardinal): Cardinal; override;
    function GetDaysInYear(AEra: Integer; AYear: Cardinal): Cardinal; override;
    function GetFullWeeksInYear(AYear: Cardinal): Cardinal; override;
    function GetMonthsInYear(AEra: Integer; AYear: Cardinal): Cardinal; override;
    function IsLeapDay(AEra: Integer; AYear, AMonth, ADay: Cardinal): Boolean; override;
    function IsLeapMonth(AEra: Integer; AYear, AMonth: Cardinal): Boolean; override;
    function IsLeapYear(AEra: Integer; AYear: Cardinal): Boolean; override;
    function ToDateTime(ADateTime: TcxDateTime): TDateTime; overload; override;

    function GetDayNumber(const S: string): Integer; override;
    function GetMonthNumber(AYear: Integer; const S: string): Integer; override;
    function GetYearNumber(const S: string): Integer; override;
  end;

  TcxGetCalendarInfo = function (Locale: LCID; Calendar: CALID;
    CalendType: CALTYPE; lpCalData : lpStr;
    cchData: Integer; lpValue: lpDWord): Integer; stdcall;

function cxGetCalendarInfo(Locale: LCID; Calendar: CALID;
  CalendType: CALTYPE; lpCalData: lpStr; cchData: Integer;
  lpValue: PDWORD): Integer;

function cxDateToLocalFormatStr(ADate: TDateTime): string;
function cxDateToStr(ADate: TDateTime): string; overload;
function cxDateToStr(ADate: TDateTime; AFormat: TFormatSettings): string; overload;
function cxDayNumberToLocalFormatStr(ADate: TDateTime): string; overload;
function cxDayNumberToLocalFormatStr(ADay: Integer; ACalendar: TcxCustomCalendarTable = nil): string; overload;
function cxGetCalendar(ACalendType: CALTYPE): TcxCustomCalendarTable;
function cxGetLocalCalendarID: TcxCALID;
function cxGetLocalCalendar: TcxCustomCalendarTable;
function cxGetDateSeparator: Char;
function cxGetLocalFormatSettings: TFormatSettings;
function cxGetLocalLongDateFormat: string;
function cxGetLocalLongTimeFormat: string;
function cxGetLocalMonthName(ADate: TDateTime; ACalendar: TcxCustomCalendarTable): string; overload;
function cxGetLocalMonthName(AYear, AMonth: Integer; ACalendar: TcxCustomCalendarTable): string; overload;
function cxGetLocalMonthYear(ADate: TDateTime; ACalendar: TcxCustomCalendarTable = nil): string;
function cxGetLocalShortDateFormat: string;
function cxGetLocalTimeAMString: string;
function cxGetLocalTimePMString: string;
function cxGetLocalTimeSeparator: Char;
function cxGetLocalYear(ADate: TDateTime; ACalendar: TcxCustomCalendarTable  = nil): string;
function cxGetDayOfWeekName(I: Integer; AFontCharset: TFontCharset): string;
function cxIsGregorianCalendar(ACalendar: TcxCustomCalendarTable = nil): Boolean;
function cxLocalFormatStrToDate(const ADateStr: string): TDateTime;
function cxStrToDate(const ADateStr: string;
  ACalendar: TcxCustomCalendarTable = nil): TcxDateTime; overload;
function cxStrToDate(const ADateStr: string;
  AFormat: TFormatSettings;
  ACalendar: TcxCustomCalendarTable = nil): TcxDateTime; overload;
function cxStrToDate(const ADateString: string; const AFormat: TFormatSettings;
  ACALTYPE: CALTYPE): TDate; overload;
function cxTimeToStr(ATime: TDateTime): string; overload;
function cxTimeToStr(ATime: TDateTime; ATimeFormat: string): string; overload;
function cxTimeToStr(ATime: TDateTime; AFormatSettings: TFormatSettings): string; overload;


var
  MinYear: Integer = 100;
  MaxYear: Integer = 9999;
  cxMaxDateTime: Double = 2958465.99999; // 12/31/9999 11:59:59.999 PM
  cxUseSingleCharWeekNames: Boolean = True;

procedure AddDateRegExprMaskSmartInput(var AMask: string; ACanEnterTime: Boolean);
procedure DecMonth(var AYear, AMonth: Word);
procedure IncMonth(var AYear, AMonth: Word); overload;
procedure ChangeMonth(var AYear, AMonth: Word; Delta: Integer);
function GetMonthNumber(const ADate: TDateTime): Integer;
function GetDateElement(ADate: TDateTime; AElement: TcxDateElement;
  ACalendar: TcxCustomCalendarTable = nil): Integer;
function IsLeapYear(AYear: Integer): Boolean;
function DaysPerMonth(AYear, AMonth: Integer): Integer;
function CheckDay(AYear, AMonth, ADay: Integer): Integer;
function TimeOf(const AValue: TDateTime): TDateTime;
function DateOf(const AValue: TDateTime): TDateTime;
function DayOfWeekOffset(const AValue: TDateTime): TDayOfWeek;

function GetStartDateOfMonth(const ADate: TDateTime): TDateTime;
function GetStartOfWeek: Integer;
function GetEndDateOfMonth(const ADate: TDateTime; AIgnoreTime: Boolean): TDateTime;
function GetStartDateOfYear(const ADate: TDateTime): TDateTime;
function GetEndDateOfYear(const ADate: TDateTime; AIgnoreTime: Boolean): TDateTime;

{!!! TODO: adapt to .net}
function cxGetDateFormat(ADate: TDateTime; out AFormatDate: string; AFlags: Integer; AFormat: string = ''): Boolean;
function DateToLongDateStr(ADate: TDateTime): string;
function GetWeekNumber(ADate: TDateTime; AStartOfWeek: TDay;
  AFirstWeekOfYear: TcxFirstWeekOfYear): Integer;

{$IFNDEF DELPHI6}
function HourOf(ADateTime: TDateTime): Word;
function IsPM(const AValue: TDateTime): Boolean;
function EncodeDateWeek(const AYear, AWeekOfYear: Word;
  const ADayOfWeek: Word): TDateTime;
procedure DecodeDateWeek(const AValue: TDateTime; out AYear, AWeekOfYear,
  ADayOfWeek: Word);
function DaysInAMonth(const AYear, AMonth: Word): Word;
function DaysInMonth(const AValue: TDateTime): Word;
function DayOf(const AValue: TDateTime): Word;
function DayOfTheMonth(const AValue: TDateTime): Word;
function DayOfTheWeek(const AValue: TDateTime): Word;
procedure DecodeDateTime(const AValue: TDateTime; out AYear, AMonth, ADay,
  AHour, AMinute, ASecond, AMilliSecond: Word);
function EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond,
  AMilliSecond: Word): TDateTime;
procedure IncAMonth(var Year, Month, Day: Word; NumberOfMonths: Integer = 1);
function MinuteOf(const AValue: TDateTime): Word;
function MonthOf(const AValue: TDateTime): Word;
function StartOfTheYear(const AValue: TDateTime): TDateTime;
function StartOfTheMonth(const AValue: TDateTime): TDateTime;
function YearOf(const AValue: TDateTime): Word;
function YearsBetween(const ANow, AThen: TDateTime): Integer;
function MonthsBetween(const ANow, AThen: TDateTime): Integer;
function WeeksBetween(const ANow, AThen: TDateTime): Integer;
function DaysBetween(const ANow, AThen: TDateTime): Integer;
function IncYear(const AValue: TDateTime;
  const ANumberOfYears: Integer = 1): TDateTime;
function IncMonth(const DateTime: TDateTime; NumberOfMonths: Integer): TDateTime; overload;
function IncWeek(const AValue: TDateTime;
  const ANumberOfWeeks: Integer = 1): TDateTime;
function IncDay(const AValue: TDateTime;
  const ANumberOfDays: Integer = 1): TDateTime;
function IncHour(const AValue: TDateTime; const ANumberOfHours: Int64 = 1): TDateTime;
function IncMinute(const AValue: TDateTime; const ANumberOfMinutes: Int64 = 1): TDateTime;
function WeekOfTheMonth(const AValue: TDateTime): Word;
function WeekOf(AValue: TDateTime): Word;
function WeekOfTheYear(const AValue: TDateTime): Word;
function DayOfTheYear(AValue: TDateTime): Word;
function EndOfTheYear(AValue: TDateTime): TDateTime;
{$ENDIF}

function cxDateTimeToText(ADate: TDateTime; AFourDigitYearNeeded: Boolean = False; AUseDelphiDateTimeFormats: Boolean = False): string;
function cxTextToDateTime(const AText: string; AUseDelphiDateTimeFormats: Boolean = False): TDateTime;
function DateTimeToText(ADate: TDateTime; AFourDigitYearNeeded: Boolean = False): string;
function DateTimeToTextEx(const ADate: TDateTime; AIsMasked: Boolean;
  AIsDateTimeEdit: Boolean = False; AFourDigitYearNeeded: Boolean = False): string;
function TextToDateEx(const AText: string; var ADate: TDateTime): Boolean;
function StrToDateDef(const ADateStr: string; ADefDate: TDateTime): TDateTime;
function SmartTextToDate(const AText: string; var ADate: TDateTime): Boolean;
function cxMinDateTime: Double;
function cxStrToDateTime(S: string; AUseOleDateFormat: Boolean;
  out ADate: TDateTime): Boolean;

implementation

uses
  DateUtils, cxFormats, cxLibraryStrs, cxControls, cxGraphics;

type
  TcxDateEditSmartInput = (deiToday, deiYesterday, deiTomorrow,
    deiSunday, deiMonday, deiTuesday, deiWednesday, deiThursday, deiFriday, deiSaturday,
    deiFirst, deiSecond, deiThird, deiFourth, deiFifth, deiSixth, deiSeventh,
    deiBOM, deiEOM, deiNow);

var
  scxDateEditSmartInput: array [TcxDateEditSmartInput] of string;

const
  cxHebrewTable: array [0..1315] of Integer =
    (7,3,17,3,                 // 1583-1584  (Hebrew year: 5343 - 5344)
    0,4,11,2,21,6,1,3,13,2,   // 1585-1589
    25,4,5,3,16,2,27,6,9,1,   // 1590-1594
    20,2,0,6,11,3,23,4,4,2,   // 1595-1599
    14,3,27,4,8,2,18,3,28,6,  // 1600
    11,1,22,5,2,3,12,3,25,4,  // 1605
    6,2,16,3,26,6,8,2,20,1,   // 1610
    0,6,11,2,24,4,4,3,15,2,   // 1615
    25,6,8,1,19,2,29,6,9,3,   // 1620
    22,4,3,2,13,3,25,4,6,3,   // 1625
    17,2,27,6,7,3,19,2,31,4,  // 1630
    11,3,23,4,5,2,15,3,25,6,  // 1635
    6,2,19,1,29,6,10,2,22,4,  // 1640
    3,3,14,2,24,6,6,1,17,3,   // 1645
    28,5,8,3,20,1,32,5,12,3,  // 1650
    22,6,4,1,16,2,26,6,6,3,   // 1655
    17,2,0,4,10,3,22,4,3,2,   // 1660
    14,3,24,6,5,2,17,1,28,6,  // 1665
    9,2,19,3,31,4,13,2,23,6,  // 1670
    3,3,15,1,27,5,7,3,17,3,   // 1675
    29,4,11,2,21,6,3,1,14,2,  // 1680
    25,6,5,3,16,2,28,4,9,3,   // 1685
    20,2,0,6,12,1,23,6,4,2,   // 1690
    14,3,26,4,8,2,18,3,0,4,   // 1695
    10,3,21,5,1,3,13,1,24,5,  // 1700
    5,3,15,3,27,4,8,2,19,3,   // 1705
    29,6,10,2,22,4,3,3,14,2,  // 1710
    26,4,6,3,18,2,28,6,10,1,  // 1715
    20,6,2,2,12,3,24,4,5,2,   // 1720
    16,3,28,4,8,3,19,2,0,6,   // 1725
    12,1,23,5,3,3,14,3,26,4,  // 1730
    7,2,17,3,28,6,9,2,21,4,   // 1735
    1,3,13,2,25,4,5,3,16,2,   // 1740
    27,6,9,1,19,3,0,5,11,3,   // 1745
    23,4,4,2,14,3,25,6,7,1,   // 1750
    18,2,28,6,9,3,21,4,2,2,   // 1755
    12,3,25,4,6,2,16,3,26,6,  // 1760
    8,2,20,1,0,6,11,2,22,6,   // 1765
    4,1,15,2,25,6,6,3,18,1,   // 1770
    29,5,9,3,22,4,2,3,13,2,   // 1775
    23,6,4,3,15,2,27,4,7,3,   // 1780
    19,2,31,4,11,3,21,6,3,2,  // 1785
    15,1,25,6,6,2,17,3,29,4,  // 1790
    10,2,20,6,3,1,13,3,24,5,  // 1795
    4,3,16,1,27,5,7,3,17,3,   // 1800
    0,4,11,2,21,6,1,3,13,2,   // 1805
    25,4,5,3,16,2,29,4,9,3,   // 1810
    19,6,30,2,13,1,23,6,4,2,  // 1815
    14,3,27,4,8,2,18,3,0,4,   // 1820
    11,3,22,5,2,3,14,1,26,5,  // 1825

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?