Skip to content

Commit e875c71

Browse files
committed
Improve PersianDayToGregorian, Close #87
1 parent 3825ef2 commit e875c71

File tree

6 files changed

+99
-48
lines changed

6 files changed

+99
-48
lines changed

global.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"sdk": {
3-
"version": "9.0.200",
3+
"version": "9.0.201",
44
"rollForward": "latestMajor",
55
"allowPrerelease": false
66
}

src/DNTPersianUtils.Core.Tests/DNTPersianUtils.Core.Tests.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
</ItemGroup>
1313
<ItemGroup>
1414
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
15-
<PackageReference Include="MSTest.TestAdapter" Version="3.8.0" />
16-
<PackageReference Include="MSTest.TestFramework" Version="3.8.0" />
15+
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
16+
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
1717
</ItemGroup>
1818
<ItemGroup>
1919
<Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" />

src/DNTPersianUtils.Core.Tests/PersianCultureTests.cs

Lines changed: 82 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@ public class PersianCultureTests
1010
[TestMethod]
1111
public void Test_GetPersianWeekDayName_Works()
1212
{
13-
var dt = new DateTime(2017, 1, 10, 10, 20, 2);
13+
var dt = new DateTime(year: 2017, month: 1, day: 10, hour: 10, minute: 20, second: 2);
1414
var actual = dt.GetPersianWeekDayName();
15-
Assert.AreEqual("سه‌شنبه", actual);
15+
Assert.AreEqual(expected: "سه‌شنبه", actual);
1616
}
1717

1818
[TestMethod]
1919
public void Test_GetPersianMonthName_Works()
2020
{
2121
var actual = 10.GetPersianMonthName();
22-
Assert.AreEqual("دی", actual);
22+
Assert.AreEqual(expected: "دی", actual);
2323
}
2424

2525
[TestMethod]
@@ -32,119 +32,160 @@ public void Test_PersianCulture_Works()
3232
[TestMethod]
3333
public void Test_GetPersianYear_Works()
3434
{
35-
var date = new DateTime(2014, 4, 20);
35+
var date = new DateTime(year: 2014, month: 4, day: 20);
3636
var year = date.GetPersianYear();
3737

38-
Assert.AreEqual(year, 1393);
38+
Assert.AreEqual(year, actual: 1393);
3939
}
4040

4141
[TestMethod]
4242
public void Test_GetPersianMonth_Works()
4343
{
44-
var date = new DateTime(2014, 4, 20);
44+
var date = new DateTime(year: 2014, month: 4, day: 20);
4545
var month = date.GetPersianMonth();
4646

47-
Assert.AreEqual(month, 1);
47+
Assert.AreEqual(month, actual: 1);
4848
}
4949

5050
[TestMethod]
5151
public void Test_GetPersianDayOfMonth_Works()
5252
{
53-
var date = new DateTime(2014, 4, 20);
53+
var date = new DateTime(year: 2014, month: 4, day: 20);
5454
var dayOfMonth = date.GetPersianDayOfMonth();
5555

56-
Assert.AreEqual(dayOfMonth, 31);
56+
Assert.AreEqual(dayOfMonth, actual: 31);
5757
}
5858

5959
[TestMethod]
60-
public void Test_PersianStopwords_Works()
61-
{
62-
Assert.IsTrue(PersianStopwords.List.Contains("احتراما"));
63-
}
60+
public void Test_PersianStopwords_Works() => Assert.IsTrue(PersianStopwords.List.Contains(item: "احتراما"));
6461

6562
[TestMethod]
66-
public void Test_ApplyRle_Works()
67-
{
68-
Assert.IsTrue("سلام".ApplyRle().StartsWith(UnicodeConstants.RleChar));
69-
}
63+
public void Test_ApplyRle_Works() => Assert.IsTrue("سلام".ApplyRle().StartsWith(UnicodeConstants.RleChar));
7064

7165
[TestMethod]
7266
public void Test_WrapInDirectionalDiv_Works()
73-
{
74-
Assert.IsTrue("تست".WrapInDirectionalDiv()
75-
.Equals("<div style='text-align: right; font-family:tahoma; font-size:9pt;' dir='rtl'>تست</div>"));
76-
}
67+
=> Assert.IsTrue("تست".WrapInDirectionalDiv()
68+
.Equals(value: "<div style='text-align: right; font-family:tahoma; font-size:9pt;' dir='rtl'>تست</div>"));
7769

7870
[TestMethod]
7971
public void Test_GetPersianYearStartAndEndDates_Works()
8072
{
8173
var persianCalendar = new PersianCalendar();
8274
var persianYear = 1397.GetPersianYearStartAndEndDates();
83-
Assert.AreEqual(new DateTime(1397, 1, 1, persianCalendar), persianYear.StartDate);
84-
Assert.AreEqual(new DateTime(1397, 12, 29, 23, 59, 59, persianCalendar), persianYear.EndDate);
75+
Assert.AreEqual(new DateTime(year: 1397, month: 1, day: 1, persianCalendar), persianYear.StartDate);
76+
77+
Assert.AreEqual(new DateTime(year: 1397, month: 12, day: 29, hour: 23, minute: 59, second: 59, persianCalendar),
78+
persianYear.EndDate);
8579
}
8680

8781
[TestMethod]
8882
public void Test_GetPersianMonthStartAndEndDates_Works()
8983
{
9084
var persianCalendar = new PersianCalendar();
91-
var persianMonth = 1397.GetPersianMonthStartAndEndDates(5);
92-
Assert.AreEqual(new DateTime(1397, 5, 1, persianCalendar), persianMonth.StartDate);
93-
Assert.AreEqual(new DateTime(1397, 5, 31, 23, 59, 59, persianCalendar), persianMonth.EndDate);
85+
var persianMonth = 1397.GetPersianMonthStartAndEndDates(persianMonth: 5);
86+
Assert.AreEqual(new DateTime(year: 1397, month: 5, day: 1, persianCalendar), persianMonth.StartDate);
87+
88+
Assert.AreEqual(new DateTime(year: 1397, month: 5, day: 31, hour: 23, minute: 59, second: 59, persianCalendar),
89+
persianMonth.EndDate);
90+
}
91+
92+
[TestMethod]
93+
public void Test_GetPersianMonthStartAndEndDates_Works_For_Leap_Years()
94+
{
95+
var persianCalendar = new PersianCalendar();
96+
var persianMonth = 1403.GetPersianMonthStartAndEndDates(persianMonth: 12);
97+
Assert.AreEqual(new DateTime(year: 1403, month: 12, day: 1, persianCalendar), persianMonth.StartDate);
98+
99+
Assert.AreEqual(new DateTime(year: 1403, month: 12, day: 30, hour: 23, minute: 59, second: 59, persianCalendar),
100+
persianMonth.EndDate);
94101
}
95102

96103
[TestMethod]
97104
public void Test_GetPersianMonthStartAndEndDates_For_Dates_Works()
98105
{
99106
var persianCalendar = new PersianCalendar();
100-
var date = new DateTime(1398, 5, 13, persianCalendar);
107+
var date = new DateTime(year: 1398, month: 5, day: 13, persianCalendar);
101108
var persianMonth = date.GetPersianMonthStartAndEndDates();
102109

103-
Assert.AreEqual(new DateTime(1398, 5, 1, persianCalendar), persianMonth.StartDate);
104-
Assert.AreEqual(new DateTime(1398, 5, 31, 23, 59, 59, persianCalendar), persianMonth.EndDate);
110+
Assert.AreEqual(new DateTime(year: 1398, month: 5, day: 1, persianCalendar), persianMonth.StartDate);
111+
112+
Assert.AreEqual(new DateTime(year: 1398, month: 5, day: 31, hour: 23, minute: 59, second: 59, persianCalendar),
113+
persianMonth.EndDate);
105114
}
106115

107116
[TestMethod]
108117
public void Test_GetPersianWeekStartAndEndDates_For_Dates_Works_1()
109118
{
110119
var persianCalendar = new PersianCalendar();
111-
var date = new DateTime(1398, 5, 13, persianCalendar);
120+
var date = new DateTime(year: 1398, month: 5, day: 13, persianCalendar);
112121
var persianWeek = date.GetPersianWeekStartAndEndDates();
113122

114-
Assert.AreEqual(new DateTime(1398, 5, 12, persianCalendar), persianWeek.StartDate);
115-
Assert.AreEqual(new DateTime(1398, 5, 18, 23, 59, 59, persianCalendar), persianWeek.EndDate);
123+
Assert.AreEqual(new DateTime(year: 1398, month: 5, day: 12, persianCalendar), persianWeek.StartDate);
124+
125+
Assert.AreEqual(new DateTime(year: 1398, month: 5, day: 18, hour: 23, minute: 59, second: 59, persianCalendar),
126+
persianWeek.EndDate);
116127
}
117128

118129
[TestMethod]
119130
public void Test_GetPersianWeekStartAndEndDates_For_Dates_Works_Saturday()
120131
{
121132
var persianCalendar = new PersianCalendar();
122-
var date = new DateTime(1398, 5, 12, persianCalendar);
133+
var date = new DateTime(year: 1398, month: 5, day: 12, persianCalendar);
123134
var persianWeek = date.GetPersianWeekStartAndEndDates();
124135

125-
Assert.AreEqual(new DateTime(1398, 5, 12, persianCalendar), persianWeek.StartDate);
126-
Assert.AreEqual(new DateTime(1398, 5, 18, 23, 59, 59, persianCalendar), persianWeek.EndDate);
136+
Assert.AreEqual(new DateTime(year: 1398, month: 5, day: 12, persianCalendar), persianWeek.StartDate);
137+
138+
Assert.AreEqual(new DateTime(year: 1398, month: 5, day: 18, hour: 23, minute: 59, second: 59, persianCalendar),
139+
persianWeek.EndDate);
127140
}
128141

129142
[TestMethod]
130143
public void Test_GetPersianWeekStartAndEndDates_For_Dates_Works_2()
131144
{
132145
var persianCalendar = new PersianCalendar();
133-
var date = new DateTime(1398, 5, 21, persianCalendar);
146+
var date = new DateTime(year: 1398, month: 5, day: 21, persianCalendar);
134147
var persianWeek = date.GetPersianWeekStartAndEndDates();
135148

136-
Assert.AreEqual(new DateTime(1398, 5, 19, persianCalendar), persianWeek.StartDate);
137-
Assert.AreEqual(new DateTime(1398, 5, 25, 23, 59, 59, persianCalendar), persianWeek.EndDate);
149+
Assert.AreEqual(new DateTime(year: 1398, month: 5, day: 19, persianCalendar), persianWeek.StartDate);
150+
151+
Assert.AreEqual(new DateTime(year: 1398, month: 5, day: 25, hour: 23, minute: 59, second: 59, persianCalendar),
152+
persianWeek.EndDate);
138153
}
139154

140155
[TestMethod]
141156
public void Test_GetPersianWeekStartAndEndDates_For_Dates_Works_3()
142157
{
143158
var persianCalendar = new PersianCalendar();
144-
var date = new DateTime(1398, 5, 30, persianCalendar);
159+
var date = new DateTime(year: 1398, month: 5, day: 30, persianCalendar);
145160
var persianWeek = date.GetPersianWeekStartAndEndDates();
146161

147-
Assert.AreEqual(new DateTime(1398, 5, 26, persianCalendar), persianWeek.StartDate);
148-
Assert.AreEqual(new DateTime(1398, 6, 1, 23, 59, 59, persianCalendar), persianWeek.EndDate);
162+
Assert.AreEqual(new DateTime(year: 1398, month: 5, day: 26, persianCalendar), persianWeek.StartDate);
163+
164+
Assert.AreEqual(new DateTime(year: 1398, month: 6, day: 1, hour: 23, minute: 59, second: 59, persianCalendar),
165+
persianWeek.EndDate);
166+
}
167+
168+
[TestMethod]
169+
public void Test_GetPersianMonthStartAndEndDates_Works_For_Leap_YearsAndDates()
170+
{
171+
var persianMonth = new PersianDay(year: 1404, month: 1, day: 1).GetPersianMonthStartAndEndDates();
172+
173+
var persianCalendar = new PersianCalendar();
174+
Assert.AreEqual(new DateTime(year: 1404, month: 1, day: 1, persianCalendar), persianMonth.StartDate);
175+
176+
Assert.AreEqual(new DateTime(year: 1404, month: 1, day: 31, hour: 23, minute: 59, second: 59, persianCalendar),
177+
persianMonth.EndDate);
178+
}
179+
180+
[TestMethod]
181+
public void Test_GetPersianMonthStartAndEndDates_Works_For_Leap_Years_And_Dates()
182+
{
183+
var persianMonth = new PersianDay(year: 1403, month: 12, day: 1).GetPersianMonthStartAndEndDates();
184+
185+
var persianCalendar = new PersianCalendar();
186+
Assert.AreEqual(new DateTime(year: 1403, month: 12, day: 1, persianCalendar), persianMonth.StartDate);
187+
188+
Assert.AreEqual(new DateTime(year: 1403, month: 12, day: 30, hour: 23, minute: 59, second: 59, persianCalendar),
189+
persianMonth.EndDate);
149190
}
150191
}

src/DNTPersianUtils.Core/DNTPersianUtils.Core.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<Description>DNTPersianUtils.Core is a collection of Persian helper extension methods.</Description>
4-
<VersionPrefix>6.6.0</VersionPrefix>
4+
<VersionPrefix>6.6.1</VersionPrefix>
55
<Authors>Vahid Nasiri</Authors>
66
<TargetFrameworks>net9.0;net8.0;net7.0;net6.0;net5.0;netstandard2.0;netstandard1.3;netstandard2.1;net46;</TargetFrameworks>
77
<TargetFrameworks Condition="'$(OS)' != 'Windows_NT'">net5.0;netstandard2.1;netstandard1.3;netstandard2.0</TargetFrameworks>

src/DNTPersianUtils.Core/IslamicDateUtils.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Diagnostics.CodeAnalysis;
4+
using System.Globalization;
45

56
namespace DNTPersianUtils.Core;
67

@@ -666,10 +667,11 @@ public static PersianDay IslamicDayToPersianDay(this int year, int month, int da
666667
/// <summary>
667668
/// PersianDay To Gregorian
668669
/// </summary>
669-
/// <param name="persian"></param>
670+
/// <param name="persianDay"></param>
670671
/// <returns></returns>
671-
public static DateTime PersianDayToGregorian(this PersianDay persian)
672-
=> JdnToGregorianDateTime(PersianDayToJdn(persian));
672+
public static DateTime PersianDayToGregorian(this PersianDay persianDay)
673+
=> new PersianCalendar().ToDateTime(persianDay.Year, persianDay.Month, persianDay.Day, hour: 0, minute: 0,
674+
second: 0, millisecond: 0);
673675

674676
/// <summary>
675677
/// تبدیل تاریخ شمسی به قمری

src/DNTPersianUtils.Core/PersianCulture.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -834,6 +834,14 @@ public static PersianMonth GetPersianMonthStartAndEndDates(this DateTime dateTim
834834
return persianYear.GetPersianMonthStartAndEndDates(persianMonth);
835835
}
836836

837+
/// <summary>
838+
/// ماه شمسی معادل را محاسبه کرده و سپس
839+
/// تاریخ روزهای ابتدا و انتهای آن ماه شمسی را بازگشت می‌دهد
840+
/// </summary>
841+
/// <param name="persianDay">اجزای روز شمسی</param>
842+
public static PersianMonth GetPersianMonthStartAndEndDates(this PersianDay persianDay)
843+
=> persianDay.PersianDayToGregorian().GetPersianMonthStartAndEndDates(convertToIranTimeZone: true);
844+
837845
#if NET6_0 || NET7_0 || NET8_0 || NET9_0
838846
/// <summary>
839847
/// ماه شمسی معادل را محاسبه کرده و سپس

0 commit comments

Comments
 (0)