A reusable .NET library for Kurdish calendar date handling, conversion, and formatting with support for Sorani, Kurmanji, and Hawrami dialects in both Latin and Arabic scripts. Includes simplified and astronomical calculations for maximum accuracy.
$ dotnet add package KurdishCalendar.CoreCore library for Kurdish calendar date handling, conversion, and formatting.
KurdishCalendar.Core is a reusable .NET 10 library providing comprehensive support for the Kurdish solar calendar system with multi-dialect and multi-script capabilities.
dotnet add package KurdishCalendar.Core
Or via Package Manager:
Install-Package KurdishCalendar.Core
Or add to .csproj:
<ItemGroup>
<PackageReference Include="KurdishCalendar.Core" Version="1.0.0" />
</ItemGroup>
using KurdishCalendar.Core;
// Create a Kurdish date
KurdishDate newroz = new KurdishDate(2725, 1, 1);
// Format in different dialects
Console.WriteLine(newroz.ToString("D", KurdishDialect.SoraniLatin));
// Output: "1 Xakelêwe 2725"
Console.WriteLine(newroz.ToString("D", KurdishDialect.SoraniArabic));
// Output: "١ خاکەلێوە ٢٧٢٥"
// Convert to Gregorian
DateTime gregorian = newroz.ToDateTime();
Console.WriteLine(gregorian.ToString("yyyy-MM-dd"));
// Output: "2025-03-21"
// Parse Kurdish dates
KurdishDate parsed = KurdishDate.Parse("15 Xermanan 2725", KurdishDialect.SoraniLatin);
Simplified calendar calculations using fixed 21 March for Nowruz.
// Create dates
KurdishDate date = new KurdishDate(2725, 6, 15);
KurdishDate today = KurdishDate.Today;
// Date arithmetic
KurdishDate tomorrow = date.AddDays(1);
KurdishDate nextMonth = date.AddMonths(1);
KurdishDate nextYear = date.AddYears(1);
// Calculate differences
int days = date2.DaysDifference(date1);
// Properties
int year = date.Year;
int month = date.Month;
int day = date.Day;
DayOfWeek dayOfWeek = date.DayOfWeek;
int dayOfYear = date.DayOfYear;
bool isLeapYear = date.IsLeapYear;
Astronomical precision using actual spring equinox calculation (±1 minute accuracy for years 1800-2200).
// Create astronomical dates
var erbil = KurdishAstronomicalDate.FromErbil(2725, 1, 1);
var tehran = KurdishAstronomicalDate.FromTehran(2725, 1, 1);
var custom = KurdishAstronomicalDate.FromLongitude(2725, 1, 1, 44.3661);
// Get exact equinox moment
DateTime equinox = erbil.ToDateTime();
Console.WriteLine($"Newroz 2725: {equinox:yyyy-MM-dd HH:mm:ss} UTC");
| Calendar | Dialect | Latin Script | Arabic Script |
|---|---|---|---|
| Kurdish Calendar | Sorani | ✓ | ✓ |
| Kurmanji | ✓ | ✓ | |
| Hawrami | ✓ | ✓ | |
| Gregorian Calendar | Sorani | ✓ | ✓ |
| Kurmanji | ✓ | ✓ |
KurdishDate date = new KurdishDate(2725, 6, 15);
// Short date
date.ToString("d", KurdishDialect.SoraniLatin);
// Output: "15/06/2725"
// Long date
date.ToString("D", KurdishDialect.SoraniLatin);
// Output: "15 Xermanan 2725"
// Custom format
date.ToString("dd MMMM yyyy", KurdishDialect.SoraniLatin);
// Output: "15 Xermanan 2725"
date.ToString("dddd, d MMMM yyyy", KurdishDialect.SoraniLatin);
// Output: "Hênî, 15 Xermanan 2725"
using KurdishCalendar.Core;
DateTime gregorian = new DateTime(2025, 5, 15);
// Sorani Gregorian
string sorani = gregorian.ToSoraniGregorian();
// Output: "15 Ayar 2025"
// Kurmanji Gregorian
string kurmanji = gregorian.ToKurmanjiGregorian();
// Output: "15 Gulan 2025"
// Arabic script
string arabicSorani = gregorian.ToSoraniGregorian(
GregorianSoraniFormatter.ScriptType.Arabic
);
// Output: "١٥ ئایار ٢٠٢٥"
// Parse with dialect
KurdishDate date1 = KurdishDate.Parse("15 Xermanan 2725", KurdishDialect.SoraniLatin);
// Safe parsing
if (KurdishDate.TryParse("15/06/2725", KurdishDialect.SoraniLatin, out KurdishDate date2))
{
Console.WriteLine($"Parsed: {date2}");
}
// Parse Arabic script
KurdishDate date3 = KurdishDate.Parse("١٥ خەرمانان ٢٧٢٥", KurdishDialect.SoraniArabic);
// Parse astronomical dates
KurdishAstronomicalDate astro = KurdishAstronomicalDate.Parse(
"1 Xakelêwe 2725",
KurdishDialect.SoraniLatin,
44.0 // Erbil longitude
);
KurdishDate date1 = new KurdishDate(2725, 1, 1);
KurdishDate date2 = new KurdishDate(2725, 6, 15);
// Comparison operators
bool equal = date1 == date2; // false
bool notEqual = date1 != date2; // true
bool lessThan = date1 < date2; // true
bool greaterThan = date1 > date2; // false
// CompareTo
int comparison = date1.CompareTo(date2); // -1
// Sorting
List<KurdishDate> dates = new List<KurdishDate> { date2, date1 };
dates.Sort();
// Result: { date1, date2 }
The Kurdish calendar is a solar calendar based on the Solar Hijri system:
95% code coverage
| Operation | Simplified | Astronomical (uncached) | Astronomical (cached) |
|---|---|---|---|
| Date creation | ~5μs | ~50μs | ~0.1μs |
| Conversion to Gregorian | ~0.1μs | ~0.1μs | ~0.1μs |
Complete documentation available in the /docs directory:
See the KurdishCalendar.Examples project for comprehensive working examples.
Run tests from the KurdishCalendar.Tests project:
cd KurdishCalendar.Tests
dotnet test
MIT Licence — See LICENSE.md for details.
/docs directoryبەختێکی باش! (Good luck!)