Skip to content

Commit

Permalink
Improve PersianDateTime
Browse files Browse the repository at this point in the history
  • Loading branch information
VahidN committed Apr 8, 2024
1 parent cc05569 commit c239426
Show file tree
Hide file tree
Showing 2 changed files with 226 additions and 8 deletions.
2 changes: 1 addition & 1 deletion src/DNTPersianUtils.Core/DNTPersianUtils.Core.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Description>DNTPersianUtils.Core is a collection of Persian helper extension methods.</Description>
<VersionPrefix>6.0.0</VersionPrefix>
<VersionPrefix>6.0.1</VersionPrefix>
<Authors>Vahid Nasiri</Authors>
<TargetFrameworks>net8.0;net7.0;net6.0;net5.0;netstandard2.0;netstandard1.3;netstandard2.1;net46;</TargetFrameworks>
<TargetFrameworks Condition="'$(OS)' != 'Windows_NT'">net5.0;netstandard2.1;netstandard1.3;netstandard2.0</TargetFrameworks>
Expand Down
232 changes: 225 additions & 7 deletions src/DNTPersianUtils.Core/PersianDateTime.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,80 @@ public PersianDateTime(string? persianDateTime)
Second = persianDateTimeValue!.Second;
}

/// <summary>
/// اجزای تاريخ و زمان شمسی
/// </summary>
public PersianDateTime(DateTime? dateTime)
{
var persianYearMonthDay = dateTime.ToPersianYearMonthDay();
IsValidDateTime = persianYearMonthDay is not null;

if (!IsValidDateTime)
{
return;
}

Year = persianYearMonthDay!.Year;
Month = persianYearMonthDay!.Month;
Day = persianYearMonthDay!.Day;
Hour = dateTime!.Value.Hour;
Minute = dateTime!.Value.Minute;
Second = dateTime!.Value.Second;
}

/// <summary>
/// اجزای تاريخ و زمان شمسی
/// </summary>
public PersianDateTime(DateTime dateTime)
{
var persianYearMonthDay = dateTime.ToPersianYearMonthDay();
IsValidDateTime = true;

Year = persianYearMonthDay!.Year;
Month = persianYearMonthDay!.Month;
Day = persianYearMonthDay!.Day;
Hour = dateTime.Hour;
Minute = dateTime.Minute;
Second = dateTime.Second;
}

/// <summary>
/// اجزای تاريخ و زمان شمسی
/// </summary>
public PersianDateTime(DateTimeOffset? dateTimeOffset)
{
var persianYearMonthDay = dateTimeOffset.ToPersianYearMonthDay();
IsValidDateTime = persianYearMonthDay is not null;

if (!IsValidDateTime)
{
return;
}

Year = persianYearMonthDay!.Year;
Month = persianYearMonthDay!.Month;
Day = persianYearMonthDay!.Day;
Hour = dateTimeOffset!.Value.Hour;
Minute = dateTimeOffset!.Value.Minute;
Second = dateTimeOffset!.Value.Second;
}

/// <summary>
/// اجزای تاريخ و زمان شمسی
/// </summary>
public PersianDateTime(DateTimeOffset dateTimeOffset)
{
var persianYearMonthDay = dateTimeOffset.ToPersianYearMonthDay();
IsValidDateTime = true;

Year = persianYearMonthDay!.Year;
Month = persianYearMonthDay!.Month;
Day = persianYearMonthDay!.Day;
Hour = dateTimeOffset.Hour;
Minute = dateTimeOffset.Minute;
Second = dateTimeOffset.Second;
}

/// <summary>
/// اجزای تاريخ و زمان شمسی
/// </summary>
Expand All @@ -52,6 +126,26 @@ public PersianDateTime(int year, int month, int day)
Second = 0;
}

/// <summary>
/// اجزای تاريخ و زمان شمسی
/// </summary>
public PersianDateTime(int? year, int? month, int? day)
{
IsValidDateTime = IsValidInstance(year, month, day, 0, 0, 0);

if (!IsValidDateTime)
{
return;
}

Year = year;
Month = month;
Day = day;
Hour = 0;
Minute = 0;
Second = 0;
}

/// <summary>
/// اجزای تاريخ و زمان شمسی
/// </summary>
Expand All @@ -72,6 +166,26 @@ public PersianDateTime(int year, int month, int day, int hour, int minute, int s
Second = second;
}

/// <summary>
/// اجزای تاريخ و زمان شمسی
/// </summary>
public PersianDateTime(int? year, int? month, int? day, int? hour, int? minute, int? second)
{
IsValidDateTime = IsValidInstance(year, month, day, hour, minute, second);

if (!IsValidDateTime)
{
return;
}

Year = year;
Month = month;
Day = day;
Hour = hour;
Minute = minute;
Second = second;
}

/// <summary>
/// اجزای تاريخ و زمان شمسی
/// </summary>
Expand All @@ -92,6 +206,26 @@ public PersianDateTime(int year, int month, int day, int hour, int minute)
Second = 0;
}

/// <summary>
/// اجزای تاريخ و زمان شمسی
/// </summary>
public PersianDateTime(int? year, int? month, int? day, int? hour, int? minute)
{
IsValidDateTime = IsValidInstance(year, month, day, hour, minute, 0);

if (!IsValidDateTime)
{
return;
}

Year = year;
Month = month;
Day = day;
Hour = hour;
Minute = minute;
Second = 0;
}

/// <summary>
/// سال شمسی
/// اگر تاريخ غيرمعتبر باشد، نال بازگشت مي‌دهد.
Expand Down Expand Up @@ -258,12 +392,22 @@ public bool Equals(PersianDateTime? x, PersianDateTime? y)
}

/// <inheritdoc />
public int GetHashCode(PersianDateTime obj)
=> GetCurrentHashCode(obj);
public int GetHashCode(PersianDateTime obj) => GetCurrentHashCode(obj);

private static bool IsValidInstance(int year, int month, int day, int hour, int minute, int second)
=> hour.IsBetween(0, 23) && minute.IsBetween(0, 59) && second.IsBetween(0, 59) &&
year.IsValidPersianDate(month, day);
private static bool IsValidInstance(int? year, int? month, int? day, int? hour, int? minute, int? second)
{
if (!year.HasValue || !month.HasValue || !day.HasValue)
{
return false;
}

hour ??= 0;
minute ??= 0;
second ??= 0;

return hour.Value.IsBetween(0, 23) && minute.Value.IsBetween(0, 59) && second.Value.IsBetween(0, 59) &&
year.Value.IsValidPersianDate(month.Value, day.Value);
}

/// <summary>
/// ToString()
Expand Down Expand Up @@ -294,8 +438,7 @@ public override bool Equals(object? obj)
/// GetHashCode
/// </summary>
/// <returns></returns>
public override int GetHashCode()
=> GetCurrentHashCode(this);
public override int GetHashCode() => GetCurrentHashCode(this);

private int GetCurrentHashCode(PersianDateTime day)
{
Expand All @@ -313,4 +456,79 @@ private int GetCurrentHashCode(PersianDateTime day)
return hash;
}
}

/// <summary>
/// Returns a PersianDateTime.
/// </summary>
public static implicit operator PersianDateTime(string? persianDateTime) => new(persianDateTime);

/// <summary>
/// Returns a PersianDateTime.
/// </summary>
public static implicit operator PersianDateTime(DateTime? dateTime) => new(dateTime);

/// <summary>
/// Returns a PersianDateTime.
/// </summary>
public static implicit operator PersianDateTime(DateTime dateTime) => new(dateTime);

/// <summary>
/// Returns a PersianDateTime.
/// </summary>
public static implicit operator PersianDateTime(DateTimeOffset? dateTimeOffset) => new(dateTimeOffset);

/// <summary>
/// Returns a PersianDateTime.
/// </summary>
public static implicit operator PersianDateTime(DateTimeOffset dateTimeOffset) => new(dateTimeOffset);

#if NET6_0 || NET7_0 || NET8_0

/// <summary>
/// Returns a PersianDateTime.
/// </summary>
public static implicit operator PersianDateTime(DateOnly? dateOnly) => new(dateOnly);

/// <summary>
/// Returns a PersianDateTime.
/// </summary>
public static implicit operator PersianDateTime(DateOnly dateOnly) => new(dateOnly);

/// <summary>
/// اجزای تاريخ و زمان شمسی
/// </summary>
public PersianDateTime(DateOnly? dateOnly)
{
var persianYearMonthDay = dateOnly.ToPersianYearMonthDay();
IsValidDateTime = persianYearMonthDay is not null;

if (!IsValidDateTime)
{
return;
}

Year = persianYearMonthDay!.Year;
Month = persianYearMonthDay!.Month;
Day = persianYearMonthDay!.Day;
Hour = 0;
Minute = 0;
Second = 0;
}

/// <summary>
/// اجزای تاريخ و زمان شمسی
/// </summary>
public PersianDateTime(DateOnly dateOnly)
{
var persianYearMonthDay = dateOnly.ToPersianYearMonthDay();
IsValidDateTime = true;

Year = persianYearMonthDay!.Year;
Month = persianYearMonthDay!.Month;
Day = persianYearMonthDay!.Day;
Hour = 0;
Minute = 0;
Second = 0;
}
#endif
}

0 comments on commit c239426

Please sign in to comment.