diff --git a/DateTimeHelper.pas b/DateTimeHelper.pas index d897b6d..6f439c7 100755 --- a/DateTimeHelper.pas +++ b/DateTimeHelper.pas @@ -5,7 +5,7 @@ MIT License -Copyright (c) 2023 Colin Johnsun +Copyright (c) 2023 - 2024 Colin Johnsun Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -32,182 +32,258 @@ interface uses - System.SysUtils, System.Types, System.DateUtils; + System.SysUtils, + System.Types, + System.DateUtils; type TDateTimeHelper = record helper for TDateTime - private - function GetDay: Word; inline; + function WithinDays(const DateTime: TDateTime; const Days: Int32): Boolean; inline; + strict private + /// Parse a string as TDateTime, using a string format ex.('MM/dd/yyyy hh:mm:ss') + /// TDateTime + /// (string) + /// (string) + /// (Char) + /// (Char) + class function Parse(const Date: string; const Format: string = ''; const DateSeparator: Char = #0; const TimeSeparator: Char = #0): TDateTime; static; inline; + /// Parse a string as TDateTime, using Local string ex. ('en-US') + /// TDateTime + /// (string) + /// (string) + class function ParseLocal(const Date: string; const Local: string = ''): TDateTime; static; inline; function GetDate: TDateTime; inline; - function GetDayOfWeek: Word; inline; - function GetDayOfYear: Word; inline; - function GetHour: Word; inline; - function GetMillisecond: Word; inline; - function GetMinute: Word; inline; - function GetMonth: Word; inline; - function GetSecond: Word; inline; - function GetTime: TDateTime; inline; - function GetYear: Word; inline; + function GetDay: UInt16; inline; + function GetDayOfWeek: UInt16; inline; + function GetDayOfYear: UInt16; inline; + function GetHour: UInt16; inline; + function GetMillisecond: UInt16; inline; + function GetMinute: UInt16; inline; + function GetMonth: UInt16; inline; class function GetNow: TDateTime; static; inline; + function GetSecond: UInt16; inline; + function GetTime: TDateTime; inline; class function GetToday: TDateTime; static; inline; class function GetTomorrow: TDateTime; static; inline; - class function GetYesterDay: TDateTime; static; inline; - function GetUnixTime: Int64; function GetTotalSecounds: Int64; - // Parse a string as TDateTime, using a string format ex.('MM/dd/yyyy hh:mm:ss') - class function Parse(Date: string; aFormat: string = ''; aDateSeparator: - Char = #0; aTimeSeparator: Char = #0): TDateTime; static; inline; - - // Parse a string as TDateTime, using local string ex. ('en-US') - class function ParseLocal(Date: string; local: string = ''): TDateTime; - static; inline; + function GetUnixTime: Int64; + function GetYear: UInt16; inline; + class function GetYesterDay: TDateTime; static; inline; public - class function Create(const aYear, aMonth, aDay: Word): TDateTime; overload; - static; inline; - class function Create(const aYear, aMonth, aDay, aHour, aMinute, aSecond, - aMillisecond: Word): TDateTime; overload; static; inline; - class function Create(Date: string; aFormat: string = ''; aDateSeparator: - Char = #0; aTimeSeparator: Char = #0): TDateTime; overload; static; inline; - class function CreateLocal(Date: string; local: string = ''): TDateTime; - static; inline; - class function CreateUnixTime(const Value: Int64): TDateTime; static; inline; + class function Create(const Date: string; const Format: string = ''; const DateSeparator: Char = #0; const TimeSeparator: Char = #0): TDateTime; overload; + static; inline; + class function Create(const Year, Month, Day: UInt16): TDateTime; overload; static; inline; + class function Create(const Year, Month, Day, Hour, Minute, Second, Millisecond: UInt16): TDateTime; overload; static; inline; + class function CreateLocal(const Date, Local: string): TDateTime; static; inline; class function CreateTotalSeconds(const Value: Int64): TDateTime; static; inline; + class function CreateUnixTime(const Value: Int64): TDateTime; static; inline; + function AddDays(const NumberOfDays: Int32 = 1): TDateTime; inline; + function AddHours(const NumberOfHours: Int64 = 1): TDateTime; inline; + function AddMilliseconds(const NumberOfMilliseconds: Int64 = 1): TDateTime; inline; + function AddMinutes(const NumberOfMinutes: Int64 = 1): TDateTime; inline; + function AddMonths(const NumberOfMonths: Int32 = 1): TDateTime; inline; + function AddSeconds(const NumberOfSeconds: Int64 = 1): TDateTime; inline; + function AddYears(const NumberOfYears: Int32 = 1): TDateTime; inline; + function AsDouble: Double; overload; + procedure AsDouble(const Value: Double); overload; + function CompareTo(const DateTime: TDateTime): TValueRelationship; inline; + function DaysBetween(const DateTime: TDateTime): Integer; inline; + function EndOfDay: TDateTime; inline; + function EndOfMonth: TDateTime; inline; + function EndOfWeek: TDateTime; inline; + function EndOfYear: TDateTime; inline; + function Equals(const DateTime: TDateTime): Boolean; inline; + function HoursBetween(const DateTime: TDateTime): Int64; inline; + function InRange(const StartDateTime, EndDateTime: TDateTime; const Inclusive: Boolean = True): Boolean; inline; + function IsAM: Boolean; inline; + function IsInLeapYear: Boolean; inline; + function IsPM: Boolean; inline; + function IsSameDay(const DateTime: TDateTime): Boolean; inline; + function IsToday: Boolean; inline; + function MilliSecondsBetween(const DateTime: TDateTime): Int64; inline; + function MinutesBetween(const DateTime: TDateTime): Int64; inline; + function MonthsBetween(const DateTime: TDateTime): Integer; inline; + function SecondsBetween(const DateTime: TDateTime): Int64; inline; + function StartOfDay: TDateTime; inline; + function StartOfMonth: TDateTime; inline; + function StartOfWeek: TDateTime; inline; + function StartOfYear: TDateTime; inline; + function ToString(const FormatStr: string = ''): string; inline; + function WeeksBetween(const DateTime: TDateTime): Int32; inline; + function WithinHours(const DateTime: TDateTime; const Hours: Int64): Boolean; inline; + function WithinMilliseconds(const DateTime: TDateTime; const Milliseconds: Int64): Boolean; inline; + function WithinMinutes(const DateTime: TDateTime; const Minutes: Int64): Boolean; inline; + function WithinMonths(const DateTime: TDateTime; const Months: Int32): Boolean; inline; + function WithinSeconds(const DateTime: TDateTime; const Seconds: Int64): Boolean; inline; + function WithinWeeks(const DateTime: TDateTime; const Weeks: Int32): Boolean; inline; + function WithinYears(const DateTime: TDateTime; const Years: Int32): Boolean; inline; + function YearsBetween(const DateTime: TDateTime): Int32; inline; class property Now: TDateTime read GetNow; class property Today: TDateTime read GetToday; - class property Yesterday: TDateTime read GetYesterDay; class property Tomorrow: TDateTime read GetTomorrow; + class property Yesterday: TDateTime read GetYesterDay; property Date: TDateTime read GetDate; + property Day: UInt16 read GetDay; + property DayOfWeek: UInt16 read GetDayOfWeek; + property DayOfYear: UInt16 read GetDayOfYear; + property Hour: UInt16 read GetHour; + property Millisecond: UInt16 read GetMillisecond; + property Minute: UInt16 read GetMinute; + property Month: UInt16 read GetMonth; + property Second: UInt16 read GetSecond; property Time: TDateTime read GetTime; - property DayOfWeek: Word read GetDayOfWeek; - property DayOfYear: Word read GetDayOfYear; - property Year: Word read GetYear; - property Month: Word read GetMonth; - property Day: Word read GetDay; - property Hour: Word read GetHour; - property Minute: Word read GetMinute; - property Second: Word read GetSecond; - property Millisecond: Word read GetMillisecond; - property UnixTime: Int64 read GetUnixTime; property TotalSeconds: Int64 read GetTotalSecounds; - function ToString(const aFormatStr: string = ''): string; inline; - function StartOfYear: TDateTime; inline; - function EndOfYear: TDateTime; inline; - function StartOfMonth: TDateTime; inline; - function EndOfMonth: TDateTime; inline; - function StartOfWeek: TDateTime; inline; - function EndOfWeek: TDateTime; inline; - function StartOfDay: TDateTime; inline; - function EndOfDay: TDateTime; inline; - function AddYears(const aNumberOfYears: Integer = 1): TDateTime; inline; - function AddMonths(const aNumberOfMonths: Integer = 1): TDateTime; inline; - function AddDays(const aNumberOfDays: Integer = 1): TDateTime; inline; - function AddHours(const aNumberOfHours: Int64 = 1): TDateTime; inline; - function AddMinutes(const aNumberOfMinutes: Int64 = 1): TDateTime; inline; - function AddSeconds(const aNumberOfSeconds: Int64 = 1): TDateTime; inline; - function AddMilliseconds(const aNumberOfMilliseconds: Int64 = 1): TDateTime; inline; - function CompareTo(const aDateTime: TDateTime): TValueRelationship; inline; - function Equals(const aDateTime: TDateTime): Boolean; inline; - function IsSameDay(const aDateTime: TDateTime): Boolean; inline; - function InRange(const aStartDateTime, aEndDateTime: TDateTime; const - aInclusive: Boolean = True): Boolean; inline; - function IsInLeapYear: Boolean; inline; - function IsToday: Boolean; inline; - function IsAM: Boolean; inline; - function IsPM: Boolean; inline; - function YearsBetween(const aDateTime: TDateTime): Integer; inline; - function MonthsBetween(const aDateTime: TDateTime): Integer; inline; - function WeeksBetween(const aDateTime: TDateTime): Integer; inline; - function DaysBetween(const aDateTime: TDateTime): Integer; inline; - function HoursBetween(const aDateTime: TDateTime): Int64; inline; - function MinutesBetween(const aDateTime: TDateTime): Int64; inline; - function SecondsBetween(const aDateTime: TDateTime): Int64; inline; - function MilliSecondsBetween(const aDateTime: TDateTime): Int64; inline; - function WithinYears(const aDateTime: TDateTime; const aYears: Integer): - Boolean; inline; - function WithinMonths(const aDateTime: TDateTime; const aMonths: Integer): - Boolean; inline; - function WithinWeeks(const aDateTime: TDateTime; const aWeeks: Integer): - Boolean; inline; - function WithinDays(const aDateTime: TDateTime; const aDays: Integer): - Boolean; inline; - function WithinHours(const aDateTime: TDateTime; const aHours: Int64): - Boolean; inline; - function WithinMinutes(const aDateTime: TDateTime; const aMinutes: Int64): - Boolean; inline; - function WithinSeconds(const aDateTime: TDateTime; const aSeconds: Int64): - Boolean; inline; - function WithinMilliseconds(const aDateTime: TDateTime; const AMilliseconds: - Int64): Boolean; inline; + property UnixTime: Int64 read GetUnixTime; + property Year: UInt16 read GetYear; end; implementation -{ TDateTimeHelper } +class function TDateTimeHelper.Create(const Date: string; const Format: string = ''; const DateSeparator: Char = #0; const TimeSeparator: Char = #0): TDateTime; +begin + Result := Parse(Date, Format, DateSeparator, TimeSeparator); +end; -function TDateTimeHelper.AddDays(const aNumberOfDays: Integer): TDateTime; +class function TDateTimeHelper.Create(const Year, Month, Day: UInt16): TDateTime; begin - Result := IncDay(Self, aNumberOfDays); + Result := EncodeDate(Year, Month, Day); end; -function TDateTimeHelper.AddHours(const aNumberOfHours: Int64): TDateTime; +class function TDateTimeHelper.Create(const Year, Month, Day, Hour, Minute, Second, Millisecond: UInt16): TDateTime; begin - Result := IncHour(Self, aNumberOfHours); + Result := EncodeDateTime(Year, Month, Day, Hour, Minute, Second, Millisecond); end; -function TDateTimeHelper.AddMilliseconds(const aNumberOfMilliseconds: Int64): TDateTime; +class function TDateTimeHelper.CreateLocal(const Date, Local: string): TDateTime; begin - Result := IncMilliSecond(Self, aNumberOfMilliseconds); + Result:= ParseLocal(Date, Local); end; -function TDateTimeHelper.AddMinutes(const aNumberOfMinutes: Int64): TDateTime; +class function TDateTimeHelper.CreateTotalSeconds(const Value: Int64): TDateTime; begin - Result := IncMinute(Self, aNumberOfMinutes); + Result := Value / 86400; end; -function TDateTimeHelper.AddMonths(const aNumberOfMonths: Integer): TDateTime; +class function TDateTimeHelper.CreateUnixTime(const Value: Int64): TDateTime; begin - Result := IncMonth(Self, aNumberOfMonths); + Result := (Value / 86400) + 25569; end; -function TDateTimeHelper.AddSeconds(const aNumberOfSeconds: Int64): TDateTime; +class function TDateTimeHelper.GetNow: TDateTime; begin - Result := IncSecond(Self, aNumberOfSeconds); + Result := System.SysUtils.Now; +end; + +class function TDateTimeHelper.GetToday: TDateTime; +begin + Result := System.SysUtils.Date; end; -function TDateTimeHelper.AddYears(const aNumberOfYears: Integer): TDateTime; +class function TDateTimeHelper.GetTomorrow: TDateTime; begin - Result := IncYear(Self, aNumberOfYears); + Result := IncDay(System.SysUtils.Date); end; -function TDateTimeHelper.CompareTo(const aDateTime: TDateTime): TValueRelationship; +class function TDateTimeHelper.GetYesterDay: TDateTime; begin - Result := CompareDateTime(Self, aDateTime); + Result := IncDay(System.SysUtils.Date, - 1); end; -class function TDateTimeHelper.Create(const aYear, aMonth, aDay: Word): TDateTime; +class function TDateTimeHelper.Parse(const Date: string; const Format: string = ''; const DateSeparator: Char = #0; const TimeSeparator: Char = #0): TDateTime; begin - Result := EncodeDate(aYear, aMonth, aDay); + var Formats: TArray := Format.Split([' ']); + var LengthFormats := Length(Formats); + + if LengthFormats = 0 then + Result := StrToDateTime(Date) + else + begin + var FormatSetting := TFormatSettings.Create(SysLocale.DefaultLCID); + + if DateSeparator <> #0 then + FormatSetting.DateSeparator := DateSeparator; + + if not Formats[0].Trim.IsEmpty then + FormatSetting.ShortDateFormat := Formats[0]; + + if LengthFormats > 1 then + begin + if TimeSeparator <> #0 then + FormatSetting.TimeSeparator := TimeSeparator; + + if not Formats[1].Trim.IsEmpty then + FormatSetting.ShortTimeFormat := Formats[1]; + end; + + Result := StrToDateTime(Date, FormatSetting); + end; end; -class function TDateTimeHelper.Create(const aYear, aMonth, aDay, aHour, aMinute, - aSecond, aMillisecond: Word): TDateTime; +class function TDateTimeHelper.ParseLocal(const Date: string; const Local: string = ''): TDateTime; begin - Result := EncodeDateTime(aYear, aMonth, aDay, aHour, aMinute, aSecond, aMillisecond); + var FormatSetting: TFormatSettings; + + if Local.Trim.IsEmpty then + FormatSetting := TFormatSettings.Create(SysLocale.DefaultLCID) + else + FormatSetting := TFormatSettings.Create(Local); + + Result := StrToDateTime(Date, FormatSetting); end; -class function TDateTimeHelper.CreateTotalSeconds(const Value: Int64): TDateTime; +function TDateTimeHelper.AddDays(const NumberOfDays: Int32 = 1): TDateTime; begin - Result := (Value / 86400); + Result := IncDay(Self, NumberOfDays); end; -class function TDateTimeHelper.CreateUnixTime(const Value: Int64): TDateTime; +function TDateTimeHelper.AddHours(const NumberOfHours: Int64 = 1): TDateTime; begin - Result := (Value / 86400) + 25569; + Result := IncHour(Self, NumberOfHours); end; -function TDateTimeHelper.DaysBetween(const aDateTime: TDateTime): Integer; +function TDateTimeHelper.AddMilliseconds(const NumberOfMilliseconds: Int64 = 1): TDateTime; begin - Result := System.DateUtils.DaysBetween(Self, aDateTime); + Result := IncMilliSecond(Self, NumberOfMilliseconds); +end; + +function TDateTimeHelper.AddMinutes(const NumberOfMinutes: Int64 = 1): TDateTime; +begin + Result := IncMinute(Self, NumberOfMinutes); +end; + +function TDateTimeHelper.AddMonths(const NumberOfMonths: Int32 = 1): TDateTime; +begin + Result := IncMonth(Self, NumberOfMonths); +end; + +function TDateTimeHelper.AddSeconds(const NumberOfSeconds: Int64 = 1): TDateTime; +begin + Result := IncSecond(Self, NumberOfSeconds); +end; + +function TDateTimeHelper.AddYears(const NumberOfYears: Int32 = 1): TDateTime; +begin + Result := IncYear(Self, NumberOfYears); +end; + +function TDateTimeHelper.AsDouble: Double; +begin + Result := Self; +end; + +procedure TDateTimeHelper.AsDouble(const Value: Double); +begin + Self := Value; +end; + +function TDateTimeHelper.CompareTo(const DateTime: TDateTime): TValueRelationship; +begin + Result := CompareDateTime(Self, DateTime); +end; + +function TDateTimeHelper.DaysBetween(const DateTime: TDateTime): Integer; +begin + Result := System.DateUtils.DaysBetween(Self, DateTime); end; function TDateTimeHelper.EndOfDay: TDateTime; @@ -230,9 +306,9 @@ function TDateTimeHelper.EndOfYear: TDateTime; Result := EndOfTheYear(Self); end; -function TDateTimeHelper.Equals(const aDateTime: TDateTime): Boolean; +function TDateTimeHelper.Equals(const DateTime: TDateTime): Boolean; begin - Result := SameDateTime(Self, aDateTime); + Result := SameDateTime(Self, DateTime); end; function TDateTimeHelper.GetDate: TDateTime; @@ -240,47 +316,42 @@ function TDateTimeHelper.GetDate: TDateTime; Result := DateOf(Self); end; -function TDateTimeHelper.GetDay: Word; +function TDateTimeHelper.GetDay: UInt16; begin Result := DayOf(Self); end; -function TDateTimeHelper.GetDayOfWeek: Word; +function TDateTimeHelper.GetDayOfWeek: UInt16; begin Result := DayOfTheWeek(Self); end; -function TDateTimeHelper.GetDayOfYear: Word; +function TDateTimeHelper.GetDayOfYear: UInt16; begin Result := DayOfTheYear(Self); end; -function TDateTimeHelper.GetHour: Word; +function TDateTimeHelper.GetHour: UInt16; begin Result := HourOf(Self); end; -function TDateTimeHelper.GetMillisecond: Word; +function TDateTimeHelper.GetMillisecond: UInt16; begin Result := MilliSecondOf(Self); end; -function TDateTimeHelper.GetMinute: Word; +function TDateTimeHelper.GetMinute: UInt16; begin Result := MinuteOf(Self); end; -function TDateTimeHelper.GetMonth: Word; +function TDateTimeHelper.GetMonth: UInt16; begin Result := MonthOf(Self); end; -class function TDateTimeHelper.GetNow: TDateTime; -begin - Result := System.SysUtils.Now; -end; - -function TDateTimeHelper.GetSecond: Word; +function TDateTimeHelper.GetSecond: UInt16; begin Result := SecondOf(Self); end; @@ -290,16 +361,6 @@ function TDateTimeHelper.GetTime: TDateTime; Result := TimeOf(Self); end; -class function TDateTimeHelper.GetToday: TDateTime; -begin - Result := System.SysUtils.Date; -end; - -class function TDateTimeHelper.GetTomorrow: TDateTime; -begin - Result := System.SysUtils.Date + 1; -end; - function TDateTimeHelper.GetTotalSecounds: Int64; begin Result := Trunc(86400 * self); @@ -310,25 +371,19 @@ function TDateTimeHelper.GetUnixTime: Int64; Result := Trunc((self - 25569) * 86400); end; -function TDateTimeHelper.GetYear: Word; +function TDateTimeHelper.GetYear: UInt16; begin Result := YearOf(Self); end; -class function TDateTimeHelper.GetYesterDay: TDateTime; +function TDateTimeHelper.HoursBetween(const DateTime: TDateTime): Int64; begin - Result := System.SysUtils.Date - 1; + Result := System.DateUtils.HoursBetween(Self, DateTime); end; -function TDateTimeHelper.HoursBetween(const aDateTime: TDateTime): Int64; +function TDateTimeHelper.InRange(const StartDateTime, EndDateTime: TDateTime; const Inclusive: Boolean = True): Boolean; begin - Result := System.DateUtils.HoursBetween(Self, aDateTime); -end; - -function TDateTimeHelper.InRange(const aStartDateTime, aEndDateTime: TDateTime; - const aInclusive: Boolean): Boolean; -begin - Result := DateTimeInRange(Self, aStartDateTime, aEndDateTime, aInclusive); + Result := DateTimeInRange(Self, StartDateTime, EndDateTime, Inclusive); end; function TDateTimeHelper.IsAM: Boolean; @@ -346,9 +401,9 @@ function TDateTimeHelper.IsPM: Boolean; Result := System.DateUtils.IsPM(Self); end; -function TDateTimeHelper.IsSameDay(const aDateTime: TDateTime): Boolean; +function TDateTimeHelper.IsSameDay(const DateTime: TDateTime): Boolean; begin - Result := System.DateUtils.IsSameDay(Self, aDateTime); + Result := System.DateUtils.IsSameDay(Self, DateTime); end; function TDateTimeHelper.IsToday: Boolean; @@ -356,24 +411,24 @@ function TDateTimeHelper.IsToday: Boolean; Result := System.DateUtils.IsToday(Self); end; -function TDateTimeHelper.MilliSecondsBetween(const aDateTime: TDateTime): Int64; +function TDateTimeHelper.MilliSecondsBetween(const DateTime: TDateTime): Int64; begin - Result := System.DateUtils.MilliSecondsBetween(Self, aDateTime); + Result := System.DateUtils.MilliSecondsBetween(Self, DateTime); end; -function TDateTimeHelper.MinutesBetween(const aDateTime: TDateTime): Int64; +function TDateTimeHelper.MinutesBetween(const DateTime: TDateTime): Int64; begin - Result := System.DateUtils.MinutesBetween(Self, aDateTime); + Result := System.DateUtils.MinutesBetween(Self, DateTime); end; -function TDateTimeHelper.MonthsBetween(const aDateTime: TDateTime): Integer; +function TDateTimeHelper.MonthsBetween(const DateTime: TDateTime): Integer; begin - Result := System.DateUtils.MonthsBetween(Self, aDateTime); + Result := System.DateUtils.MonthsBetween(Self, DateTime); end; -function TDateTimeHelper.SecondsBetween(const aDateTime: TDateTime): Int64; +function TDateTimeHelper.SecondsBetween(const DateTime: TDateTime): Int64; begin - Result := System.DateUtils.SecondsBetween(Self, aDateTime); + Result := System.DateUtils.SecondsBetween(Self, DateTime); end; function TDateTimeHelper.StartOfDay: TDateTime; @@ -396,129 +451,62 @@ function TDateTimeHelper.StartOfYear: TDateTime; Result := StartOfTheYear(Self); end; -function TDateTimeHelper.ToString(const aFormatStr: string): string; +function TDateTimeHelper.ToString(const FormatStr: string = ''): string; begin - if aFormatStr = '' then + if FormatStr.IsEmpty then Result := DateToStr(Self) else - Result := FormatDateTime(aFormatStr, Self); -end; - -function TDateTimeHelper.WeeksBetween(const aDateTime: TDateTime): Integer; -begin - Result := System.DateUtils.WeeksBetween(Self, aDateTime); -end; - -function TDateTimeHelper.WithinDays(const aDateTime: TDateTime; const aDays: - Integer): Boolean; -begin - Result := System.DateUtils.WithinPastDays(Self, aDateTime, aDays); -end; - -function TDateTimeHelper.WithinHours(const aDateTime: TDateTime; const aHours: - Int64): Boolean; -begin - Result := System.DateUtils.WithinPastHours(Self, aDateTime, aHours); + Result := FormatDateTime(FormatStr, Self); end; -function TDateTimeHelper.WithinMilliseconds(const aDateTime: TDateTime; const - AMilliseconds: Int64): Boolean; +function TDateTimeHelper.WeeksBetween(const DateTime: TDateTime): Int32; begin - Result := System.DateUtils.WithinPastMilliSeconds(Self, aDateTime, AMilliseconds); + Result := System.DateUtils.WeeksBetween(Self, DateTime); end; -function TDateTimeHelper.WithinMinutes(const aDateTime: TDateTime; const - aMinutes: Int64): Boolean; +function TDateTimeHelper.WithinDays(const DateTime: TDateTime; const Days: Int32): Boolean; begin - Result := System.DateUtils.WithinPastMinutes(Self, aDateTime, aMinutes); + Result := System.DateUtils.WithinPastDays(Self, DateTime, Days); end; -function TDateTimeHelper.WithinMonths(const aDateTime: TDateTime; const aMonths: - Integer): Boolean; +function TDateTimeHelper.WithinHours(const DateTime: TDateTime; const Hours: Int64): Boolean; begin - Result := System.DateUtils.WithinPastMonths(Self, aDateTime, aMonths); + Result := System.DateUtils.WithinPastHours(Self, DateTime, Hours); end; -function TDateTimeHelper.WithinSeconds(const aDateTime: TDateTime; const - aSeconds: Int64): Boolean; +function TDateTimeHelper.WithinMilliseconds(const DateTime: TDateTime; const Milliseconds: Int64): Boolean; begin - Result := System.DateUtils.WithinPastSeconds(Self, aDateTime, aSeconds); + Result := System.DateUtils.WithinPastMilliSeconds(Self, DateTime, Milliseconds); end; -function TDateTimeHelper.WithinWeeks(const aDateTime: TDateTime; const aWeeks: - Integer): Boolean; +function TDateTimeHelper.WithinMinutes(const DateTime: TDateTime; const Minutes: Int64): Boolean; begin - Result := System.DateUtils.WithinPastWeeks(Self, aDateTime, aWeeks); + Result := System.DateUtils.WithinPastMinutes(Self, DateTime, Minutes); end; -function TDateTimeHelper.WithinYears(const aDateTime: TDateTime; const aYears: - Integer): Boolean; +function TDateTimeHelper.WithinMonths(const DateTime: TDateTime; const Months: Int32): Boolean; begin - Result := System.DateUtils.WithinPastYears(Self, aDateTime, aYears); + Result := System.DateUtils.WithinPastMonths(Self, DateTime, Months); end; -function TDateTimeHelper.YearsBetween(const aDateTime: TDateTime): Integer; +function TDateTimeHelper.WithinSeconds(const DateTime: TDateTime; const Seconds: Int64): Boolean; begin - Result := System.DateUtils.YearsBetween(Self, aDateTime); + Result := System.DateUtils.WithinPastSeconds(Self, DateTime, Seconds); end; -class function TDateTimeHelper.Parse(Date: string; aFormat: string = ''; - aDateSeparator: Char = #0; aTimeSeparator: Char = #0): TDateTime; -var - fs: TFormatSettings; - aFormats: TArray; - aLength: Integer; +function TDateTimeHelper.WithinWeeks(const DateTime: TDateTime; const Weeks: Int32): Boolean; begin - aFormats := aFormat.split([' ']); - - aLength := Length(aFormats); - - if aLength = 0 then - exit(StrToDateTime(Date)); - - GetLocaleFormatSettings(SysLocale.DefaultLCID, fs); - with fs do - begin - - if aDateSeparator <> #0 then - DateSeparator := aDateSeparator; - - if not aFormats[0].Trim.IsEmpty then - ShortDateFormat := aFormats[0]; - - if aLength > 1 then - begin - if aTimeSeparator <> #0 then - TimeSeparator := aTimeSeparator; - - if not aFormats[1].Trim.IsEmpty then - ShortTimeFormat := aFormats[1]; - end; - end; - Result := StrToDateTime(Date, fs); -end; - -class function TDateTimeHelper.ParseLocal(Date: string; local: string = ''): TDateTime; -var - fs: TFormatSettings; -begin - if local.Trim.IsEmpty then - fs := TFormatSettings.Create(SysLocale.DefaultLCID) - else - fs := TFormatSettings.Create(local); - - Result := StrToDateTime(Date, fs); + Result := System.DateUtils.WithinPastWeeks(Self, DateTime, Weeks); end; -class function TDateTimeHelper.Create(Date, aFormat: string; aDateSeparator, - aTimeSeparator: Char): TDateTime; +function TDateTimeHelper.WithinYears(const DateTime: TDateTime; const Years: Int32): Boolean; begin - Result := Parse(Date, aFormat, aDateSeparator, aTimeSeparator); + Result := System.DateUtils.WithinPastYears(Self, DateTime, Years); end; -class function TDateTimeHelper.CreateLocal(Date, local: string): TDateTime; +function TDateTimeHelper.YearsBetween(const DateTime: TDateTime): Int32; begin - Result:= ParseLocal(Date,local); + Result := System.DateUtils.YearsBetween(Self, DateTime); end; end. diff --git a/Tests/TDateTimeHelper.Tests.pas b/Tests/TDateTimeHelper.Tests.pas index 1a14a86..ecd5ac5 100755 --- a/Tests/TDateTimeHelper.Tests.pas +++ b/Tests/TDateTimeHelper.Tests.pas @@ -62,6 +62,10 @@ TDateTimeHelperTestObject = class(TObject) procedure DateTime_TotalSecounds; [Test] procedure DateTime_UnixTime; + [Test] + procedure AsDoubleSet; + [Test] + procedure AsDoubleGet; end; implementation @@ -249,6 +253,21 @@ procedure TDateTimeHelperTestObject.DateTime_UnixTime; Assert.AreEqual(Expected, Actual); end; +procedure TDateTimeHelperTestObject.AsDoubleSet; +begin + var Expected: Double := FExpected; + var Actual := FActual.AsDouble; + Assert.AreEqual(Expected, Double(Actual)); +end; + +procedure TDateTimeHelperTestObject.AsDoubleGet; +begin + var Expected: Double := FExpected; + var Actual: TDateTime; + Actual.AsDouble(FActual); + Assert.AreEqual(Expected, FActual); +end; + initialization TDUnitX.RegisterTestFixture(TDateTimeHelperTestObject); diff --git a/Tests/TDateTimeHelperTests.dpr b/Tests/TDateTimeHelperTests.dpr index d55e64f..72dc4bf 100755 --- a/Tests/TDateTimeHelperTests.dpr +++ b/Tests/TDateTimeHelperTests.dpr @@ -1,48 +1,63 @@ program TDateTimeHelperTests; {$IFNDEF TESTINSIGHT} -{$APPTYPE CONSOLE} -{$ENDIF}{$STRONGLINKTYPES ON} + {$APPTYPE CONSOLE} +{$ENDIF} +{$STRONGLINKTYPES ON} uses + {$IFDEF EurekaLog} + EMemLeaks, + EResLeaks, + EDebugJCL, + EDebugExports, + EFixSafeCallException, + EMapWin32, + EAppVCL, + EDialogWinAPIEurekaLogDetailed, + EDialogWinAPIStepsToReproduce, + ExceptionLog7, + {$ENDIF EurekaLog} System.SysUtils, +{$IFDEF TESTINSIGHT} + TestInsight.DUnitX, +{$ELSE} DUnitX.Loggers.Console, DUnitX.Loggers.Xml.NUnit, - DUnitX.TestFramework, -{$IFDEF VER240} - DUnitX.Init, // Workaround for Delphi XE3 Compiler Bug -{$ENDIF} +{$ENDIF } DateTimeHelper in '..\DateTimeHelper.pas', TDateTimeHelper.Tests in 'TDateTimeHelper.Tests.pas'; +{$IFNDEF TESTINSIGHT} var - Runner: ITestRunner; - Results: IRunResults; - Logger: ITestLogger; - NUnitLogger: ITestLogger; + runner: ITestRunner; + results: IRunResults; + logger: ITestLogger; + nunitLogger : ITestLogger; +{$ENDIF} begin + ReportMemoryLeaksOnShutdown := True; {$IFDEF TESTINSIGHT} TestInsight.DUnitX.RunRegisteredTests; - Exit; -{$ENDIF} +{$ELSE} try //Check command line options, will exit if invalid TDUnitX.CheckCommandLine; //Create the test runner - Runner := TDUnitX.CreateRunner; + LRunner := TDUnitX.CreateRunner; //Tell the runner to use RTTI to find Fixtures - Runner.UseRTTI := True; + LRunner.UseRTTI := True; //tell the runner how we will log things //Log to the console window - Logger := TDUnitXConsoleLogger.Create(True); - Runner.AddLogger(Logger); + LLogger := TDUnitXConsoleLogger.Create(true); + LRunner.AddLogger(LLogger); //Generate an NUnit compatible XML File - NUnitLogger := TDUnitXXMLNUnitFileLogger.Create(TDUnitX.Options.XMLOutputFile); - Runner.AddLogger(NUnitLogger); - Runner.FailsOnNoAsserts := False; //When true, Assertions must be made during tests; + LNUnitLogger := TDUnitXXMLNUnitFileLogger.Create(TDUnitX.Options.XMLOutputFile); + LRunner.AddLogger(LNUnitLogger); + LRunner.FailsOnNoAsserts := False; //When true, Assertions must be made during tests; //Run tests - Results := Runner.Execute; - if not Results.AllPassed then + LResults := LRunner.Execute; + if not LResults.AllPassed then System.ExitCode := EXIT_ERRORS; {$IFNDEF CI} @@ -57,4 +72,8 @@ begin on E: Exception do System.Writeln(E.ClassName, ': ', E.Message); end; +{$ENDIF} + end. + + diff --git a/Tests/TDateTimeHelperTests.dproj b/Tests/TDateTimeHelperTests.dproj index f645d1a..2d78f44 100755 --- a/Tests/TDateTimeHelperTests.dproj +++ b/Tests/TDateTimeHelperTests.dproj @@ -1,7 +1,7 @@  {E992A111-A05C-4625-AB5A-2B563821B4BE} - 18.8 + 20.1 None TDateTimeHelperTests.dpr True @@ -9,40 +9,11 @@ Win32 1 Console + TDateTimeHelperTests true - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - true Base @@ -69,18 +40,6 @@ Base true - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - $(DUnitX);$(DCC_UnitSearchPath) bindcompfmx;fmx;rtl;dbrtl;IndySystem;DbxClientDriver;bindcomp;inetdb;DBXInterBaseDriver;xmlrtl;ibxpress;DbxCommonDriver;IndyProtocols;DBXMySQLDriver;dbxcds;soaprtl;bindengine;FMXTee;dsnap;IndyCore;fmxase;CloudService;FmxTeeUI;inet;fmxobj;inetdbxpress;fmxdae;dbexpress;$(DCC_UsePackage) @@ -95,100 +54,11 @@ false TDateTimeHelperTests $(BDS)\bin\delphi_PROJECTICNS.icns - - - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - Debug - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png - true - true - true - true - true - true - true - true - true - true - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png - android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false - iPhoneAndiPad - true - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - $(BDS)\bin\delphi_PROJECTICNS.icns - - - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts - Debug - true - Base - true + TESTINSIGHT;EUREKALOG_VER7;EUREKALOG;$(DCC_Define) + 1040 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + 3 + true vcldbx;frx16;TeeDB;vclib;inetdbbde;Tee;svnui;vclimg;frxDB16;intrawebdb_120_160;fmi;fs16;vclactnband;TeeUI;vcldb;bindcompvcl;vcldsnap;vclie;vcltouch;Intraweb_120_160;websnap;vclribbon;frxe16;VclSmp;fsDB16;vcl;CodeSiteExpressPkg;dsnapcon;vclx;webdsnap;svn;bdertl;adortl;$(DCC_UsePackage) @@ -208,6 +78,9 @@ false + 1033 + (None) + none false @@ -215,24 +88,12 @@ 0 0 - - $(BDS)\bin\delphi_PROJECTICNS.icns - - - true - Cfg_2 - true - MainSource - - Cfg_2 - Base - Base @@ -240,6 +101,10 @@ Cfg_1 Base + + Cfg_2 + Base + Delphi.Personality.12 @@ -276,13 +141,12 @@ TDateTimeHelperTests.dpr + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + - - - - true - - + true @@ -293,6 +157,11 @@ true + + + true + + 1 @@ -301,14 +170,14 @@ 0 - + classes - 1 + 64 classes - 1 + 64 @@ -321,12 +190,6 @@ 1 - - - library\lib\armeabi-v7a - 1 - - library\lib\armeabi @@ -379,6 +242,16 @@ 1 + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + res\values @@ -399,6 +272,66 @@ 1 + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + res\values @@ -409,6 +342,16 @@ 1 + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + res\drawable @@ -429,6 +372,16 @@ 1 + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + res\drawable-ldpi @@ -569,6 +522,56 @@ 1 + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + 1 @@ -589,6 +592,10 @@ 1 .framework + + 1 + .framework + 0 @@ -602,6 +609,10 @@ 1 .dylib + + 1 + .dylib + 0 .dll;.bpl @@ -616,7 +627,7 @@ 1 .dylib - + 1 .dylib @@ -628,6 +639,10 @@ 1 .dylib + + 1 + .dylib + 0 .bpl @@ -646,7 +661,7 @@ 0 - + 0 @@ -655,403 +670,352 @@ 0 + + 0 + 0 - - - 1 - - + + 1 - + 1 - - + + + + + + Contents\Resources 1 - + + Contents\Resources 1 - + + Contents\Resources 1 - - - 1 - - + + + library\lib\armeabi-v7a 1 - + + library\lib\arm64-v8a 1 - - 1 1 - - 1 - - - - + 1 - + 1 - + 1 - - - + 1 - + 1 - - 1 + + 0 - - - 1 - - - 1 - - + + + library\lib\armeabi-v7a 1 - - + + 1 - + 1 - + 1 - + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 - + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 - + + + + 1 1 - + 1 - - - 1 - - + + + Assets 1 - + + Assets 1 - - - 1 - - + + + Assets 1 - + + Assets 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - - + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - + - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - - - - - - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - - - - Contents\Resources + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - Contents\Resources + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - 1 - - - 1 - - - 1 - - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - 0 - - - - library\lib\armeabi-v7a + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - - 1 - - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - Assets + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - Assets + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - Assets + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - Assets + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - + + + + + - - - - + + + + - False - False - False - False - False - False - False True False