Skip to content

Commit 3715c84

Browse files
committed
Add date-only conversion functions and improve docs
Introduced GregorianToKurdishDate and KurdishToGregorianDate functions for direct date-only conversions without time.Time. Updated README with expanded usage examples, dialect and epoch handling, formatting, error handling, and new function documentation. Standardized Kurdish digit formatting in format.go.
1 parent 068863a commit 3715c84

3 files changed

Lines changed: 146 additions & 38 deletions

File tree

README.md

Lines changed: 117 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ go get github.com/rojcode/kurdical
2121

2222
## Usage
2323

24+
### Basic Conversion
25+
2426
```go
2527
package main
2628

@@ -35,30 +37,119 @@ func main() {
3537
t := time.Date(2023, 3, 21, 0, 0, 0, 0, time.UTC)
3638
k := kurdical.GregorianToKurdish(t, kurdical.Sorani, kurdical.MedianKingdom)
3739
fmt.Printf("Kurdish date: %d-%d-%d %s\n", k.Year, k.Month, k.Day, k.MonthName)
40+
// Output: Kurdish date: 2723-1-1 خاکه‌لێوه
41+
}
42+
```
43+
44+
### Round Trip Conversion
45+
46+
```go
47+
// Convert Kurdish to Gregorian
48+
g, err := kurdical.KurdishToGregorian(k)
49+
if err != nil {
50+
fmt.Println(err)
51+
} else {
52+
fmt.Printf("Gregorian date: %s\n", g.Format("2006-01-02"))
53+
// Output: Gregorian date: 2023-03-21
54+
}
55+
```
56+
57+
### Different Dialects
58+
59+
```go
60+
// Sorani dialect
61+
kSorani := kurdical.GregorianToKurdish(t, kurdical.Sorani, kurdical.MedianKingdom)
62+
fmt.Printf("Sorani: %s\n", kSorani.MonthName) // خاکه‌لێوه
63+
64+
// Kurmanji dialect
65+
kKurmanji := kurdical.GregorianToKurdish(t, kurdical.Kurmanji, kurdical.MedianKingdom)
66+
fmt.Printf("Kurmanji: %s\n", kKurmanji.MonthName) // نیسان
67+
68+
// Laki dialect
69+
kLaki := kurdical.GregorianToKurdish(t, kurdical.Laki, kurdical.MedianKingdom)
70+
fmt.Printf("Laki: %s\n", kLaki.MonthName) // په‌نجه
71+
```
72+
73+
### Different Epochs
74+
75+
```go
76+
// Median Kingdom epoch
77+
kMedian := kurdical.GregorianToKurdish(t, kurdical.Sorani, kurdical.MedianKingdom)
78+
fmt.Printf("Median Kingdom: %d\n", kMedian.Year) // 2723
79+
80+
// Fall of Nineveh epoch
81+
kNineveh := kurdical.GregorianToKurdish(t, kurdical.Sorani, kurdical.FallOfNineveh)
82+
fmt.Printf("Fall of Nineveh: %d\n", kNineveh.Year) // 2635
83+
```
84+
85+
### Formatting with Kurdish Digits
86+
87+
```go
88+
formatted, err := k.KFormat("2006-01-02 January")
89+
if err != nil {
90+
fmt.Println("Error:", err)
91+
} else {
92+
fmt.Printf("Formatted: %s\n", formatted)
93+
// Output: Formatted: ٢٧٢٣-٠١-٠١ خاکه‌لێوه
94+
}
95+
```
3896

39-
// Convert Kurdish to Gregorian
40-
g, err := kurdical.KurdishToGregorian(k)
41-
if err != nil {
42-
fmt.Println(err)
43-
} else {
44-
fmt.Printf("Gregorian date: %s\n", g.Format("2006-01-02"))
45-
}
46-
47-
// Create a specific Kurdish date and convert to Gregorian
48-
// Note: Dialect is optional and not used in conversion, only Epoch matters
49-
specificKurdish := kurdical.KurdishDate{
50-
Year: 2725,
51-
Month: 9,
52-
Day: 24,
53-
Dialect: kurdical.Sorani, // Optional
54-
Epoch: kurdical.MedianKingdom,
55-
}
56-
gregorianSpecific, err := kurdical.KurdishToGregorian(specificKurdish)
57-
if err != nil {
58-
fmt.Println("Error:", err)
59-
} else {
60-
fmt.Printf("Kurdish 2725-09-24 to Gregorian: %s\n", gregorianSpecific.Format("2006-01-02"))
61-
}
97+
### Weekday Display
98+
99+
```go
100+
fmt.Printf("Weekday: %s\n", kurdical.WeekdayNames[k.Weekday])
101+
// Output: Weekday: سێشەممە (for Tuesday)
102+
```
103+
104+
### Creating Kurdish Date Manually
105+
106+
```go
107+
// Create a specific Kurdish date and convert to Gregorian
108+
specificKurdish := kurdical.KurdishDate{
109+
Year: 2725,
110+
Month: 9,
111+
Day: 24,
112+
Dialect: kurdical.Sorani, // Optional
113+
Epoch: kurdical.MedianKingdom,
114+
}
115+
gregorianSpecific, err := kurdical.KurdishToGregorian(specificKurdish)
116+
if err != nil {
117+
fmt.Println("Error:", err)
118+
} else {
119+
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
121+
}
122+
```
123+
124+
### Date-Only Functions
125+
126+
```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)
132+
if 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
137+
}
138+
```
139+
140+
### Error Handling
141+
142+
```go
143+
// Invalid date
144+
invalidKurdish := kurdical.KurdishDate{
145+
Year: 2725,
146+
Month: 13, // Invalid month
147+
Day: 24,
148+
Epoch: kurdical.MedianKingdom,
149+
}
150+
_, err := kurdical.KurdishToGregorian(invalidKurdish)
151+
if err != nil {
152+
fmt.Printf("Error: %s\n", err) // Error: invalid month: 13
62153
}
63154
```
64155

@@ -73,8 +164,10 @@ func main() {
73164
### Functions
74165

75166
- `GregorianToKurdish(t time.Time, dialect Dialect, epoch Epoch) KurdishDate`
167+
- `GregorianToKurdishDate(year, month, day int, dialect Dialect, epoch Epoch) KurdishDate`
76168
- `KurdishToGregorian(k KurdishDate) (time.Time, error)`
77-
- `(k KurdishDate) KFormat(layout string) (string, error)`: Formats the Kurdish date using Go time layout strings with Persian digits
169+
- `KurdishToGregorianDate(kYear, kMonth, kDay int, epoch Epoch) (int, int, int, error)`
170+
- `(k KurdishDate) KFormat(layout string) (string, error)`: Formats the Kurdish date using Go time layout strings with Kurdish digits
78171

79172
## Kurdish Calendar Details
80173

format.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -275,15 +275,15 @@ func appendInt(b []byte, x int, width int) []byte {
275275
for u >= 10 {
276276
i--
277277
q := u / 10
278-
buf[i] = rune('۰' + u - q*10)
278+
buf[i] = rune('٠' + u - q*10)
279279
u = q
280280
}
281281
i--
282-
buf[i] = rune('۰' + u)
282+
buf[i] = rune('٠' + u)
283283

284284
// Add 0-padding.
285285
for w := len(buf) - i; w < width; w++ {
286-
b = append(b, []byte("۰")...)
286+
b = append(b, []byte("٠")...)
287287
}
288288

289289
return append(b, []byte(string(buf[i:]))...)
@@ -296,15 +296,15 @@ func formatNano(b []byte, nanosec uint, n int, trim bool) []byte {
296296
var buf [9]rune
297297
for start := len(buf); start > 0; {
298298
start--
299-
buf[start] = rune(u%10 + '۰')
299+
buf[start] = rune(u%10 + '٠')
300300
u /= 10
301301
}
302302

303303
if n > 9 {
304304
n = 9
305305
}
306306
if trim {
307-
for n > 0 && buf[n-1] == '۰' {
307+
for n > 0 && buf[n-1] == '٠' {
308308
n--
309309
}
310310
if n == 0 {

kurdical.go

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,17 @@ var epochOffsets = map[Epoch]int{
5050
// GregorianToKurdish converts a Gregorian time.Time to a KurdishDate.
5151
func GregorianToKurdish(t time.Time, dialect Dialect, epoch Epoch) KurdishDate {
5252
year, month, day := t.Date()
53-
sYear, sMonth, sDay := gregorianToSolarHijri(year, int(month), day)
53+
return GregorianToKurdishDate(year, int(month), day, dialect, epoch)
54+
}
55+
56+
// GregorianToKurdishDate converts Gregorian year, month, day to KurdishDate.
57+
func GregorianToKurdishDate(year, month, day int, dialect Dialect, epoch Epoch) KurdishDate {
58+
sYear, sMonth, sDay := gregorianToSolarHijri(year, month, day)
5459
kYear := sYear + epochOffsets[epoch]
5560
monthName := monthNames[dialect][sMonth-1]
5661

57-
// Calculate Kurdish weekday: 1=Saturday, 2=Sunday, ..., 7=Friday
62+
// Calculate weekday from Gregorian date
63+
t := time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC)
5864
weekday := int(t.Weekday())
5965
switch weekday {
6066
case 0: // Sunday
@@ -86,17 +92,26 @@ func GregorianToKurdish(t time.Time, dialect Dialect, epoch Epoch) KurdishDate {
8692

8793
// KurdishToGregorian converts a KurdishDate to a Gregorian time.Time.
8894
func KurdishToGregorian(k KurdishDate) (time.Time, error) {
89-
if k.Month < 1 || k.Month > 12 {
90-
return time.Time{}, &ErrorInvalidMonth{Month: k.Month}
95+
year, month, day, err := KurdishToGregorianDate(k.Year, k.Month, k.Day, k.Epoch)
96+
if err != nil {
97+
return time.Time{}, err
98+
}
99+
return time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC), nil
100+
}
101+
102+
// KurdishToGregorianDate converts Kurdish year, month, day to Gregorian year, month, day.
103+
func KurdishToGregorianDate(kYear, kMonth, kDay int, epoch Epoch) (int, int, int, error) {
104+
if kMonth < 1 || kMonth > 12 {
105+
return 0, 0, 0, &ErrorInvalidMonth{Month: kMonth}
91106
}
92107
monthDays := []int{31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29}
93-
sYear := k.Year - epochOffsets[k.Epoch]
108+
sYear := kYear - epochOffsets[epoch]
94109
if isSolarHijriLeap(sYear) {
95110
monthDays[11] = 30
96111
}
97-
if k.Day < 1 || k.Day > monthDays[k.Month-1] {
98-
return time.Time{}, &ErrorInvalidDay{Day: k.Day}
112+
if kDay < 1 || kDay > monthDays[kMonth-1] {
113+
return 0, 0, 0, &ErrorInvalidDay{Day: kDay}
99114
}
100-
gYear, gMonth, gDay := solarHijriToGregorian(sYear, k.Month, k.Day)
101-
return time.Date(gYear, time.Month(gMonth), gDay, 0, 0, 0, 0, time.UTC), nil
115+
gYear, gMonth, gDay := solarHijriToGregorian(sYear, kMonth, kDay)
116+
return gYear, gMonth, gDay, nil
102117
}

0 commit comments

Comments
 (0)