11# kurdical
22
3- A Go module for Kurdish calendar utilities.
3+ ## About the Kurdish Calendar
44
5- This module provides conversion between Gregorian and Kurdish calendars, supporting two historical epochs and month names in five Kurdish dialects.
5+ The Kurdish calendar is an independent solar calendar system with historical offsets aligned to significant events in Kurdish history.
6+
7+ It supports two main historical epochs:
8+
9+ - ** Median Kingdom (Diako) epoch** : Starting from the establishment of the Median kingdom by Diako
10+ - ** Fall of Nineveh (Cyaxares) epoch** : Starting from the fall of Nineveh by Cyaxares
11+
12+ The Kurdish year is calculated by adding epoch-specific offsets to the base solar calendar year.
613
714## Features
815
916- Convert Gregorian dates to Kurdish calendar
1017- Convert Kurdish calendar dates back to Gregorian
11- - Support for two Kurdish historical epochs:
12- - Median Kingdom (Diako)
13- - Fall of Nineveh (Cyaxares)
18+ - Support for two historical epochs (Median Kingdom and Fall of Nineveh)
1419- Month names in 5 Kurdish dialects: Laki, Hawrami, Sorani, Kalhuri, Kurmanji
20+ - Display weekdays in Kurdish
21+ - Format dates with Kurdish digits (٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩)
22+ - Error handling and date validation
23+ - 100% test coverage
24+ - Complete documentation with practical examples
1525
1626## Installation
1727
@@ -21,7 +31,7 @@ go get github.com/rojcode/kurdical
2131
2232## Usage
2333
24- ### Basic Conversion
34+ ### 1. Basic Gregorian to Kurdish Conversion
2535
2636``` go
2737package main
@@ -33,18 +43,16 @@ import (
3343)
3444
3545func main () {
36- // Convert Gregorian to Kurdish
3746 t := time.Date (2023 , 3 , 21 , 0 , 0 , 0 , 0 , time.UTC )
3847 k := kurdical.GregorianToKurdish (t, kurdical.Sorani , kurdical.MedianKingdom )
3948 fmt.Printf (" Kurdish date: %d -%d -%d %s \n " , k.Year , k.Month , k.Day , k.MonthName )
4049 // Output: Kurdish date: 2723-1-1 خاکهلێوه
4150}
4251```
4352
44- ### Round Trip Conversion
53+ ### 2. Round Trip Conversion
4554
4655``` go
47- // Convert Kurdish to Gregorian
4856g , err := kurdical.KurdishToGregorian (k)
4957if err != nil {
5058 fmt.Println (err)
@@ -54,7 +62,7 @@ if err != nil {
5462}
5563```
5664
57- ### Different Dialects
65+ ### 3. Different Kurdish Dialects
5866
5967``` go
6068// Sorani dialect
@@ -68,9 +76,17 @@ fmt.Printf("Kurmanji: %s\n", kKurmanji.MonthName) // نیسان
6876// Laki dialect
6977kLaki := kurdical.GregorianToKurdish (t, kurdical.Laki , kurdical.MedianKingdom )
7078fmt.Printf (" Laki: %s \n " , kLaki.MonthName ) // پهنجه
79+
80+ // Hawrami dialect
81+ kHawrami := kurdical.GregorianToKurdish (t, kurdical.Hawrami , kurdical.MedianKingdom )
82+ fmt.Printf (" Hawrami: %s \n " , kHawrami.MonthName ) // نهورۆز
83+
84+ // Kalhuri dialect
85+ kKalhuri := kurdical.GregorianToKurdish (t, kurdical.Kalhuri , kurdical.MedianKingdom )
86+ fmt.Printf (" Kalhuri: %s \n " , kKalhuri.MonthName ) // جهژنان (جهشنان)
7187```
7288
73- ### Different Epochs
89+ ### 4. Different Historical Epochs
7490
7591``` go
7692// Median Kingdom epoch
@@ -82,7 +98,14 @@ kNineveh := kurdical.GregorianToKurdish(t, kurdical.Sorani, kurdical.FallOfNinev
8298fmt.Printf (" Fall of Nineveh: %d \n " , kNineveh.Year ) // 2635
8399```
84100
85- ### Formatting with Kurdish Digits
101+ ### 5. Weekday Display
102+
103+ ``` go
104+ fmt.Printf (" Weekday: %s \n " , kurdical.WeekdayNames [k.Weekday ])
105+ // Output: Weekday: سێشەممە
106+ ```
107+
108+ ### 6. Formatting with Kurdish Digits
86109
87110``` go
88111formatted , err := k.KFormat (" 2006-01-02 January" )
@@ -94,62 +117,145 @@ if err != nil {
94117}
95118```
96119
97- ### Weekday Display
120+ ### 7. Using Date-Only Functions
98121
99122``` go
100- fmt.Printf (" Weekday: %s \n " , kurdical.WeekdayNames [k.Weekday ])
101- // Output: Weekday: سێشەممە (for Tuesday)
123+ k := kurdical.GregorianToKurdishDate (2023 , 3 , 21 , kurdical.Sorani , kurdical.MedianKingdom )
124+ fmt.Printf (" Kurdish: %d -%d -%d %s \n " , k.Year , k.Month , k.Day , k.MonthName )
125+ ```
126+
127+ ### 8. Converting Kurdish to Gregorian
128+
129+ ``` go
130+ gy , gm , gd , err := kurdical.KurdishToGregorianDate (k.Year , k.Month , k.Day , k.Epoch )
131+ if err != nil {
132+ fmt.Println (" Error:" , err)
133+ } else {
134+ fmt.Printf (" Gregorian: %d -%d -%d \n " , gy, gm, gd)
135+ }
102136```
103137
104- ### Creating Kurdish Date Manually
138+ ### 9. Creating Kurdish Date Manually
105139
106140``` go
107- // Create a specific Kurdish date and convert to Gregorian
108141specificKurdish := kurdical.KurdishDate {
109142 Year : 2725 ,
110143 Month : 9 ,
111144 Day : 24 ,
112- Dialect : kurdical.Sorani , // Optional
145+ Dialect : kurdical.Sorani ,
113146 Epoch : kurdical.MedianKingdom ,
114147}
115148gregorianSpecific , err := kurdical.KurdishToGregorian (specificKurdish)
116149if err != nil {
117150 fmt.Println (" Error:" , err)
118151} else {
119152 fmt.Printf (" Kurdish 2725-09-24 to Gregorian: %s \n " , gregorianSpecific.Format (" 2006-01-02" ))
120- // Output: Kurdish 2725-09-24 to Gregorian: 2025-12-15
121153}
122154```
123155
124- ### Date-Only Functions
156+ ### 10. Invalid Month Error Handling
125157
126158``` go
127- // Using date-only functions without time.Time
128- k := kurdical.GregorianToKurdishDate (2023 , 3 , 21 , kurdical.Sorani , kurdical.MedianKingdom )
129- fmt.Printf (" Kurdish: %d -%d -%d %s \n " , k.Year , k.Month , k.Day , k.MonthName )
130-
131- gy , gm , gd , err := kurdical.KurdishToGregorianDate (k.Year , k.Month , k.Day , k.Epoch )
159+ // Invalid month
160+ invalidKurdish := kurdical.KurdishDate {
161+ Year : 2725 ,
162+ Month : 13 , // Invalid month
163+ Day : 24 ,
164+ Epoch : kurdical.MedianKingdom ,
165+ }
166+ _ , err := kurdical.KurdishToGregorian (invalidKurdish)
132167if err != nil {
133- fmt.Println (" Error:" , err)
134- } else {
135- fmt.Printf (" Gregorian: %d -%d -%d \n " , gy, gm, gd)
136- // Output: Gregorian: 2023-3-21
168+ fmt.Printf (" Error: %s \n " , err) // Error: invalid month: 13
137169}
138170```
139171
140- ### Error Handling
172+ ### 11. Invalid Day Error Handling
141173
142174``` go
143- // Invalid date
144- invalidKurdish := kurdical.KurdishDate {
175+ // Invalid day
176+ invalidDay := kurdical.KurdishDate {
145177 Year : 2725 ,
146- Month : 13 , // Invalid month
147- Day : 24 ,
178+ Month : 1 ,
179+ Day : 32 , // Invalid day
148180 Epoch : kurdical.MedianKingdom ,
149181}
150- _ , err := kurdical.KurdishToGregorian (invalidKurdish )
182+ _ , err := kurdical.KurdishToGregorian (invalidDay )
151183if err != nil {
152- fmt.Printf (" Error: %s \n " , err) // Error: invalid month: 13
184+ fmt.Printf (" Error: %s \n " , err) // Error: invalid day: 32 for month 1 in year 2725
185+ }
186+ ```
187+
188+ ### 12. Different Dates of Year
189+
190+ ``` go
191+ // January date
192+ janDate := kurdical.GregorianToKurdishDate (2023 , 1 , 1 , kurdical.Sorani , kurdical.MedianKingdom )
193+ fmt.Printf (" January: %d -%d -%d %s \n " , janDate.Year , janDate.Month , janDate.Day , janDate.MonthName )
194+
195+ // December date
196+ decDate := kurdical.GregorianToKurdishDate (2023 , 12 , 31 , kurdical.Sorani , kurdical.MedianKingdom )
197+ fmt.Printf (" December: %d -%d -%d %s \n " , decDate.Year , decDate.Month , decDate.Day , decDate.MonthName )
198+ ```
199+
200+ ### 13. Comparing Epochs
201+
202+ ``` go
203+ date := time.Date (2023 , 6 , 15 , 0 , 0 , 0 , 0 , time.UTC )
204+
205+ median := kurdical.GregorianToKurdish (date, kurdical.Sorani , kurdical.MedianKingdom )
206+ nineveh := kurdical.GregorianToKurdish (date, kurdical.Sorani , kurdical.FallOfNineveh )
207+
208+ fmt.Printf (" Median Kingdom: %d -%d -%d \n " , median.Year , median.Month , median.Day )
209+ fmt.Printf (" Fall of Nineveh: %d -%d -%d \n " , nineveh.Year , nineveh.Month , nineveh.Day )
210+ fmt.Printf (" Year difference: %d \n " , median.Year - nineveh.Year ) // 88
211+ ```
212+
213+ ### 14. Different Format Layouts
214+
215+ ``` go
216+ layouts := []string {
217+ " 2006-01-02" ,
218+ " 2006/01/02 January" ,
219+ " 02 Jan 2006" ,
220+ " Monday, 02 January 2006" ,
221+ }
222+
223+ for _ , layout := range layouts {
224+ formatted , _ := k.KFormat (layout)
225+ fmt.Printf (" Format %s : %s \n " , layout, formatted)
226+ }
227+ ```
228+
229+ ### 15. Complete Program Example
230+
231+ ``` go
232+ package main
233+
234+ import (
235+ " fmt"
236+ " time"
237+ " github.com/rojcode/kurdical"
238+ )
239+
240+ func main () {
241+ // Current date
242+ now := time.Now ()
243+ kurdishNow := kurdical.GregorianToKurdish (now, kurdical.Sorani , kurdical.MedianKingdom )
244+
245+ fmt.Printf (" Current Gregorian: %s \n " , now.Format (" 2006-01-02 15:04:05" ))
246+ fmt.Printf (" Current Kurdish: %d -%d -%d %s (%s )\n " ,
247+ kurdishNow.Year , kurdishNow.Month , kurdishNow.Day ,
248+ kurdishNow.MonthName , kurdical.WeekdayNames [kurdishNow.Weekday ])
249+
250+ // Convert to specific Kurdish date
251+ newYearKurdish := kurdical.KurdishDate {
252+ Year: 2726 ,
253+ Month: 1 ,
254+ Day: 1 ,
255+ Epoch: kurdical.MedianKingdom ,
256+ }
257+ newYearGregorian , _ := kurdical.KurdishToGregorian (newYearKurdish)
258+ fmt.Printf (" Kurdish New Year 2726: %s \n " , newYearGregorian.Format (" 2006-01-02" ))
153259}
154260```
155261
@@ -171,14 +277,14 @@ if err != nil {
171277
172278## Kurdish Calendar Details
173279
174- The Kurdish calendar is based on the Solar Hijri calendar with adjusted epochs.
280+ The Kurdish calendar uses epoch-specific historical adjustments:
175281
176- - Median Kingdom epoch: Kurdish year = Solar Hijri year + 1321
177- - Fall of Nineveh epoch: Kurdish year = Solar Hijri year + 1233
282+ - Median Kingdom epoch: Kurdish year = Base year + 1321
283+ - Fall of Nineveh epoch: Kurdish year = Base year + 1233
178284
179285## Cultural Notes
180286
181- This module respects Kurdish cultural heritage by providing accurate month names in authentic dialects. The UTF-8 encoding ensures proper display of Kurdish characters.
287+ This module respects Kurdish cultural heritage by providing accurate month names in authentic dialects. UTF-8 encoding ensures proper display of Kurdish characters.
182288
183289## License
184290
0 commit comments