AfghanShamsiCalendar is a professional, multilingual calendar library designed for Android applications that implements the Shamsi/Jalali (Afghan & Iranian) Solar Calendar system. It provides accurate conversion between Shamsi, Gregorian, and Hijri calendars, along with localized month and weekday names in Pashto, Persian (Dari), English, and Kurdish.
The library is designed with a clean and stable API, making it suitable for academic, commercial, and production-grade applications.
AfghanShamsiCalendar provides a comprehensive and flexible API with 65+ constructors and utility methods for full control over date calculations and conversions. AfghanShamsiCalendar allows developers to:
-
Initialize dates using Shamsi or Gregorian formats
-
Retrieve Shamsi, Gregorian, and Hijri dates
-
Access month and weekday names in multiple languages
-
Detect Shamsi leap years and calculate month lengths
-
Determine the first weekday of a Shamsi month
- Accurate Shamsi (Afghan & Iranian) date calculations
- Shamsi (Jalali) ↔ Gregorian ↔ Hijri (Islamic) conversions
- Hijri date calculation
- Localized month names (Afghan, Pashto, Persian, Kurdish, English)
- Localized weekday names in multiple languages
- Shamsi leap year detection
- Month length calculation for Shamsi calendar
- First weekday index of each Shamsi month
- Clean, well-documented API
- Compatible with Android projects
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}
}dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
mavenCentral()
maven { url = uri("https://jitpack.io") }
}
}dependencies {
implementation 'com.github.bahaar208:AfghanShamsiCalendar:v1.0.0'
}dependencies {
implementation("com.github.bahaar208:AfghanShamsiCalendar:v1.0.0")
}(Creating and initializing the calendar)
| Constructor | Description | Example | Output (e.g.) |
|---|---|---|---|
AfghanShamsiCalendar() |
Initializes the calendar with the current system date in Shamsi. | AfghanShamsiCalendar shamsiCalendar = new AfghanShamsiCalendar(); |
Current Shamsi date object. e.g. 2025-12-19 |
AfghanShamsiCalendar(int year, int month, int day) |
Initializes the calendar with a specific Gregorian date. | AfghanShamsiCalendar shamsiCalendar = new AfghanShamsiCalendar(2026,2,18); |
Shamsi date object for 2026-2-18 |
AfghanShamsiCalendar(boolean isShamsi, int year, int month, int day) |
Initializes the calendar using a Shamsi date, based on the isShamsi flag. | AfghanShamsiCalendar shamsiCalendar = new AfghanShamsiCalendar(true, 1404-10-30); |
Shamsi date object for 1404-10-30 |
AfghanShamsiCalendar(LocalDate gregorianDate) |
Initializes the calendar using a specific Gregorian date, automatically converting it to Shamsi. | AfghanShamsiCalendar shamsiCalendar = new AfghanShamsiCalendar(LocalDate.of(2026,1,20)); |
Shamsi date object for equivalent Shamsi date |
AfghanShamsiCalendar(LocalDate gregorianDate) |
Initializes the calendar using a Today's Gregorian date, automatically converting it to Shamsi. | AfghanShamsiCalendar shamsiCalendar = new AfghanShamsiCalendar(LocalDate.now()); |
Shamsi date object for 1404-9-28 |
(Updating Gregorian or Shamsi dates after initialization)
| Method | Description | Example | Output (e.g) |
|---|---|---|---|
setGregorianDate(LocalDate date) |
Set Gregorian date using LocalDate |
shamsiCalendar.setGregorianDate(LocalDate.of(2026,1,20)); |
Shamsi: 1404-10-30 |
setGregorianDate(int year,int month,int day) |
Set Gregorian date using year, month, day | shamsiCalendar.setGregorianDate(2026,1,20); |
Shamsi: 1404-10-30 |
setShamsiDate(int shYear,int shMonth,int shDay) |
Set Shamsi date | shamsiCalendar.setShamsiDate(1404,10,30); |
Gregorian: 2026-1-20 |
setShYear(int year) |
Update Shamsi year | shamsiCalendar.setShYear(1405); |
Shamsi: 1405-10-30 |
setShMonth(int month) |
Update Shamsi month | shamsiCalendar.setShMonth(11); |
Shamsi: 1405-11-30 |
setShDay(int day) |
Update Shamsi day | shamsiCalendar.setShDay(29); |
Shamsi: 1405-11-29 |
(Month length, leap year checks, and first-day-of-month calculations)
| Method | Description | Example | Output (e.g.) |
|---|---|---|---|
isShamsiLeapYear() |
Returns true if the current Shamsi year is a leap year. |
shamsiCalendar.isShamsiLeapYear(); |
false |
isShamsiLeapYear(int year) |
Returns true if the specified Shamsi year is a leap year. (Overloaded) |
shamsiCalendar.isShamsiLeapYear(1403); |
true |
getAfghanMonthLength() |
Returns the number of days in the current Shamsi month. | shamsiCalendar.getAfghanMonthLength(); |
30 |
getAfghanMonthLength(int year, int month) |
Returns the number of days in a specific Shamsi month. (Overloaded) | shamsiCalendar.getAfghanMonthLength(1404, 1); |
31 |
getFirstWeekdayOfMonth() |
Returns the weekday name on which the current month starts. | shamsiCalendar.getFirstWeekdayOfMonth(); |
دوشنبه |
getDayOfWeek() |
Returns the number of leading empty days before the first day of the month. | shamsiCalendar.getDayOfWeek(); |
2 |
getWeekdayIndex() |
Returns the weekday index of the current day (Saturday = 0). | shamsiCalendar.getWeekdayIndex(); |
3 |
getWeekdayIndexOfFirstDay() |
Returns the weekday index of the first day of the month (Saturday = 0). | shamsiCalendar.getWeekdayIndexOfFirstDay(); |
2 |
getWeekdayName() |
Returns the weekday name of the current date. | shamsiCalendar.getWeekdayName(); |
سه شنبه |
(Core Shamsi date values with Afghan/Dari and Pashto month names)
| Method | Description | Example | Output (e.g.) |
|---|---|---|---|
getShamsiDate() |
Returns the full Shamsi date as a formatted string (yyyy-MM-dd). |
shamsiCalendar.getShamsiDate(); |
1404-10-30 |
getShYear() |
Returns the Shamsi year. | shamsiCalendar.getShYear(); |
1404 |
getShMonth() |
Returns the Shamsi month number (1–12). | shamsiCalendar.getShMonth(); |
10 |
getShDay() |
Returns the Shamsi day of month. | shamsiCalendar.getShDay(); |
30 |
isShamsiLeapYear() |
Returns true if the current Shamsi year is a leap year. |
shamsiCalendar.isShamsiLeapYear(); |
false |
isShamsiLeapYear(int year) |
Returns true if the specified Shamsi year is a leap year. (Overloaded) |
shamsiCalendar.isShamsiLeapYear(1403); |
true |
getAfghanMonthLength() |
Returns number of days in the current Shamsi month. | shamsiCalendar.getAfghanMonthLength(); |
30 |
getAfghanMonthLength(int year, int month) |
Returns number of days in a specific Shamsi month. (Overloaded) | shamsiCalendar.getAfghanMonthLength(1404, 1); |
31 |
AfghanMonthName() |
Returns Afghan (Dari) month name in local script. | shamsiCalendar.AfghanMonthName(); |
جدی |
AfghanEnglishMonthName() |
Returns Afghan month name in English. | shamsiCalendar.AfghanEnglishMonthName(); |
Jaddi |
AfghanMonthNameByIndex(int index) |
Returns Afghan month name by index (1–12). | shamsiCalendar.AfghanMonthNameByIndex(12); |
حوت |
AfghanEnglishMonthNameByIndex(int index) |
Returns Afghan month name in English by index. | shamsiCalendar.AfghanEnglishMonthNameByIndex(12); |
Huth |
PashtoMonthName() |
Returns Pashto month name for current Shamsi month. | shamsiCalendar.PashtoMonthName(); |
مرغومی |
PashtoMonthEnglishName() |
Returns Pashto month name in English. | shamsiCalendar.PashtoMonthEnglishName(); |
Marghomay |
PashtoMonthNameByIndex(int index) |
Returns Pashto month name by index (1–12). | shamsiCalendar.PashtoMonthNameByIndex(12); |
کب |
PashtoMonthEnglishNameByIndex(int index) |
Returns Pashto month name in English by index. | shamsiCalendar.PashtoMonthEnglishNameByIndex(12); |
Kab |
setShYear(int year) |
Updates the Shamsi year while keeping the current month and day. | shamsiCalendar.setShYear(1405); |
1405-10-30 |
setShMonth(int month) |
Updates the Shamsi month while keeping the current year and day. | shamsiCalendar.setShMonth(11); |
1404-11-30 |
setShDay(int day) |
Updates the Shamsi day while keeping the current year and month. | shamsiCalendar.setShDay(29); |
1404-10-29 |
(Accessing and formatting Gregorian date information)
| Method | Description | Example | Output (e.g) |
|---|---|---|---|
getGregorianDate() |
Returns LocalDate of Gregorian date |
shamsiCalendar.getGregorianDate(); |
2026-1-20 |
getGrgYear() |
Returns Gregorian year | shamsiCalendar.getGrgYear(); |
2026 |
getGrgMonth() |
Returns Gregorian month | shamsiCalendar.getGrgMonth(); |
1 |
getGrgDay() |
Returns Gregorian day | shamsiCalendar.getGrgDay(); |
20 |
GregorianMonthName() |
Current Gregorian month name | shamsiCalendar.GregorianMonthName(); |
January |
GregorianMonthNameByIndex(int index) |
Gregorian month by index | shamsiCalendar.GregorianMonthNameByIndex(12); |
December |
(Hijri date values and Arabic/English month names)
| Method | Description | Example | Output (e.g.) |
|---|---|---|---|
getHijriDate() |
Returns the full Hijri date as a formatted string (yyyy-MM-dd). |
shamsiCalendar.getHijriDate(); |
1447-8-1 |
getHijriYear() |
Returns the Hijri year. | shamsiCalendar.getHijriYear(); |
1447 |
getHijriMonth() |
Returns the Hijri month number (1–12). | shamsiCalendar.getHijriMonth(); |
8 |
getHijriDay() |
Returns the Hijri day of month. | shamsiCalendar.getHijriDay(); |
1 |
HijriArabicMonthName() |
Returns the Hijri month name in Arabic. | shamsiCalendar.HijriArabicMonthName(); |
شَعْبَان |
HijriEnglishMonthName() |
Returns the Hijri month name in English. | shamsiCalendar.HijriEnglishMonthName(); |
Shaban |
HijriArabicMonthNameByIndex(int index) |
Returns the Hijri month name in Arabic for a given index (1–12). | shamsiCalendar.HijriArabicMonthNameByIndex(9); |
رَمَضَان |
HijriEnglishMonthNameByIndex(int index) |
Returns the Hijri month name in English for a given index (1–12). | shamsiCalendar.HijriEnglishMonthNameByIndex(9); |
Ramadan |
(Iranian calendar month names in Persian and English)
| Method | Description | Example | Output (e.g.) |
|---|---|---|---|
ShamsiIranianPersianMonthName() |
Iranian Shamsi month in Persian | shamsiCalendar.ShamsiIranianPersianMonthName(); |
دی |
ShamsiIranianPersianMonthNameByIndex(int index) |
Iranian month Persian by index | shamsiCalendar.ShamsiIranianPersianMonthNameByIndex(9); |
آذر |
ShamsiIranianEnglishMonthName() |
Iranian Shamsi month in English | shamsiCalendar.ShamsiIranianEnglishMonthName(); |
Dey |
ShamsiIranianEnglishMonthNameByIndex(int index) |
Iranian month English by index | shamsiCalendar.ShamsiIranianEnglishMonthNameByIndex(9); |
Azar |
(Kurdish Sorani month names and English transliterations)
| Method | Description | Example | Output (e.g.) |
|---|---|---|---|
KurdishMonthName() |
Kurdish Sorani month | shamsiCalendar.KurdishMonthName(); |
بەفرانبار |
KurdishMonthNameByIndex(int index) |
Kurdish month by index | shamsiCalendar.KurdishMonthNameByIndex(12); |
ڕەشەمە |
KurdishMonthEnglishName() |
Kurdish month in English | shamsiCalendar.KurdishEnglishMonthName(); |
Befranbar |
KurdishMonthEnglishNameByIndex(int index) |
Kurdish month English by index | shamsiCalendar.KurdishEnglishMonthNameByIndex(12); |
Reshame |
(Day names, weekday indexes, and month-start calculations)
| Method | Description | Example | Output (e.g.) |
|---|---|---|---|
AfghanDayName() |
Day name in Afghan (Dari) | shamsiCalendar.AfghanDayName(); |
سهشنبه |
AfghanDayEnglishName() |
Day name in English (Dari) | shamsiCalendar.AfghanDayEnglishName(); |
Seshanba |
PashtoDayName() |
Day name in Pashto | shamsiCalendar.AfghanDayName(); |
منځينۍ |
PashtoDayEnglishName() |
Day name in English (Pashto) | shamsiCalendar.AfghanDayEnglishName(); |
Manzinai |
EnglishDayName() |
Weekday name in English | shamsiCalendar.EnglishDayName(); |
Tuesday |
PersainDayEnglishName() |
Persian day name in English | shamsiCalendar.PersainDayEnglishName(); |
Seshanbe |
KurdishDayName() |
Kurdish day name | shamsiCalendar.KurdishDayName(); |
سێ شەممە |
KurdishDayEnglishName() |
Kurdish day name in English | shamsiCalendar.KurdishDayEnglishName(); |
Se Shamma |
getWeekdayIndex() |
Returns index of current weekday | shamsiCalendar.getWeekdayIndex(); |
3 |
getWeekdayIndexOfFirstDay() |
Returns index of first day in the month | shamsiCalendar.getWeekdayIndexOfFirstDay(); |
2 |
getDayOfWeek() |
Returns the number of leading empty days before the first day of the month. | shamsiCalendar.getDayOfWeek(); |
2 |
getWeekdayName() |
Returns Shamsi weekday name | shamsiCalendar.getWeekdayName(); |
سهشنبه |
getFirstWeekdayOfMonth() |
Returns weekday name of first day of month | shamsiCalendar.getFirstWeekdayOfMonth(); |
دوشنبه |
// ==================== Constructors ====================
// Initialize AfghanShamsiCalendar with default constructor (today's date)
AfghanShamsiCalendar shamsiCalendar = new AfghanShamsiCalendar();
// Example Output: Gregorian: 2025-12-19, Shamsi: 1404-9-28, Hijri: 1447-6-28
// OR initialize with current system date using LocalDate.now()
AfghanShamsiCalendar shamsiCalendar2 = new AfghanShamsiCalendar(LocalDate.now());
// Example Output: Gregorian: 2026-01-20, Shamsi: 1404-10-30, Hijri: 1447-8-1
// OR initialize with a specific Gregorian date
AfghanShamsiCalendar shamsiCalendar3 = new AfghanShamsiCalendar(LocalDate.of(2026, 1, 20));
// Output: Gregorian: 2026-01-20, Shamsi: 1404-10-30, Hijri: 1447-8-1
// OR initialize directly with a Shamsi date
AfghanShamsiCalendar shamsiCalendar4 = new AfghanShamsiCalendar(true, 1404, 10, 30);
// Output: Gregorian: 2026-01-20, Shamsi: 1404-10-30, Hijri: 1447-8-1
// OR initialize with Gregorian year, month, day directly
AfghanShamsiCalendar shamsiCalendar5 = new AfghanShamsiCalendar(2026, 1, 20);
// Output: Gregorian: 2026-01-20, Shamsi: 1404-10-30, Hijri: 1447-8-1
// ==================== Weekday / Calendar Grid ====================
// Get the weekday name on which the current Shamsi month starts.
// This tells you which day the 1st of the month falls on.
String firstWeekdayName = shamsiCalendar.getFirstWeekdayOfMonth(); // Output: "دوشنبه/Monday"
// Get the number of leading empty days before the first day of the current Shamsi month.
// Example
// If the month starts on Monday, and the week starts from Saturday,
// then Saturday and Sunday come before Monday.
// These two days are considered empty cells in a calendar grid,
// so this method will return 2.
// (Very useful for building calendar grid UI layouts)
int leadingEmptyDays = shamsiCalendar.getDayOfWeek(); // Output: 2
// ==================== Weekday Index ====================
// Get the weekday index of the current day.
// Week index mapping:
// Saturday = 0, Sunday = 1, Monday = 2, ..., Friday = 6
// Useful for positioning the current day inside a week row.
int weekdayIndex = shamsiCalendar.getWeekdayIndex(); // Output: 3
// Get the weekday index of the first day of the current Shamsi month.
// Uses the same index mapping (Saturday = 0).
// Helpful for calculating where the month should start in a calendar grid.
int firstDayIndex = shamsiCalendar.getWeekdayIndexOfFirstDay(); // Output: 2
// ==================== Weekday Name ====================
// Get the weekday name of the current Shamsi date.
// Returns the localized weekday name (e.g., Pashto / Afghan format).
// Useful for headers, date labels, or detail views.
String weekdayName = shamsiCalendar.getWeekdayName(); // Output: "سهشنبه/Tuesday"
// ==================== Leap Year ====================
// Check if the current Shamsi year is a leap year.
// A leap year in Shamsi calendar affects the length of the last month (حوت).
boolean isCurrentLeap = shamsiCalendar.isShamsiLeapYear(); // Output: true / false
// Check if a specific Shamsi year is a leap year.
// Useful when calculating month lengths for past or future years.
boolean is1403Leap = shamsiCalendar.isShamsiLeapYear(1403); // Output: true
// ==================== Afghan (Shamsi) Month Length ====================
// Get the number of days in the current Shamsi month.
// Automatically considers leap year rules if the month is the last month.
int currentMonthLength = shamsiCalendar.getAfghanMonthLength(); // Output: 30
// Get the number of days in a specific Shamsi month and year.
// Useful for generating full calendar views or validating dates.
int monthLength = shamsiCalendar.getAfghanMonthLength(1404, 1); // Output: 31
// ==================== Get Dates ====================
String gregorian = shamsiCalendar.getGregorianDate().toString(); // Output: "2026-01-20"
String shamsi = shamsiCalendar.getShamsiDate(); // Output: "1404-10-30"
String hijri = shamsiCalendar.getHijriDate(); // Output: "1447-8-1"
// --- Gregorian ---
int grgYear = shamsiCalendar.getGrgYear(); // Output: 2026
int grgMonth = shamsiCalendar.getGrgMonth(); // Output: 1
int grgDay = shamsiCalendar.getGrgDay(); // Output: 20
// --- Shamsi ---
int shYear = shamsiCalendar.getShYear(); // Output: 1404
int shMonth = shamsiCalendar.getShMonth(); // Output: 10
int shDay = shamsiCalendar.getShDay(); // Output: 30
// --- Hijri ---
int hijriYear = shamsiCalendar.getHijriYear(); // Output: 1447
int hijriMonth = shamsiCalendar.getHijriMonth(); // Output: 8
int hijriDay = shamsiCalendar.getHijriDay(); // Output: 1
// ==================== Month Names ====================
// Get month names for each calendar (current date: 2026-01-20)
String gregorianMonth = shamsiCalendar.GregorianMonthName(); // Output: "January"
String afghanMonth = shamsiCalendar.AfghanMonthName(); // Output: "جدی"
String afghanMonthEnglish = shamsiCalendar.AfghanEnglishMonthName(); // Output: "Jaddi"
String shamsiMonthPashto = shamsiCalendar.PashtoMonthName(); // Output: "مرغومی"
String hijriMonthArabic = shamsiCalendar.HijriArabicMonthName(); // Output: "شَعْبَان"
String hijriMonthEnglish = shamsiCalendar.HijriEnglishMonthName(); // Output: "Shaaban"
String shamsiMonthEnglish = shamsiCalendar.PashtoMonthEnglishName(); // Output: "Marghomay"
String shamsiMonthPersian = shamsiCalendar.ShamsiIranianPersianMonthName(); // Output: "دی"
String shamsiMonthEnglishPersian = shamsiCalendar.ShamsiIranianEnglishMonthName(); // Output: "Dey"
String kurdishMonth = shamsiCalendar.KurdishMonthName(); // Output: "بەفرانبار"
String kurdishMonthEnglish = shamsiCalendar.KurdishEnglishMonthName(); // Output: "Befranbar"
// ---------------- By Index Methods ----------------
// Gregorian
String gregorianMonthByIndex = shamsiCalendar.GregorianMonthNameByIndex(3); // Output: "March"
// Afghan
String afghanMonthByIndex = shamsiCalendar.AfghanMonthNameByIndex(1); // Output: "حمل"
String afghanMonthEnglishByIndex = shamsiCalendar.AfghanEnglishMonthNameByIndex(1); // Output: "Hamal"
// Pashto (Shamsi)
String pashtoMonthByIndex = shamsiCalendar.PashtoMonthNameByIndex(2); // Output: "غويی"
String pashtoMonthEnglishByIndex = shamsiCalendar.PashtoMonthEnglishNameByIndex(2); // Output: "Ghowai"
// Iranian (Persian)
String persianMonthByIndex = shamsiCalendar.ShamsiIranianPersianMonthNameByIndex(7); // Output: "مهر"
String persianMonthEnglishByIndex = shamsiCalendar.ShamsiIranianEnglishMonthNameByIndex(7); // Output: "Mehr"
// Kurdish
String kurdishMonthByIndex = shamsiCalendar.KurdishMonthNameByIndex(2); // Output: "گوڵان"
String kurdishMonthEnglishByIndex = shamsiCalendar.KurdishEnglishMonthNameByIndex(2); // Output: "Gulan"
// Hijri
String hijriMonthArabicByIndex = shamsiCalendar.HijriArabicMonthNameByIndex(1); // Output: "ٱلْمُحَرَّم"
String hijriMonthEnglishByIndex = shamsiCalendar.HijriEnglishMonthNameByIndex(1); // Output: "Muharam"
// // ==================== Weekdays in Multiple Languages ====================
// Get weekday names in different languages/localizations
// Get weekday name in Afghan (Pashto) script
String weekdayAfghan = shamsiCalendar.AfghanDayName(); // Output: "سهشنبه"
// Get weekday name in Afghan (Pashto) in English
String weekdayAfghanEnglish = shamsiCalendar.AfghanDayEnglishName(); // Output: "Seshanba"
// Get weekday name in English (Gregorian style)
String weekdayEnglish = shamsiCalendar.EnglishDayName(); // Output: "Tuesday"
// Get weekday name in Persian (English)
String weekdayPersianEnglish = shamsiCalendar.PersainDayEnglishName(); // Output: "Seshanbe"
// Get weekday name in Kurdish
String weekdayKurdish = shamsiCalendar.KurdishDayName(); // Output: "سێ شەممە"
// Get weekday name in Kurdish (English)
String weekdayKurdishEnglish = shamsiCalendar.KurdishDayEnglishName(); // Output: "Se Shamma"
// Get weekday name in Pashto
String weekdayPashto = shamsiCalendar.PashtoDayName(); // Output: "منځينۍ"
// Get weekday name in Pashto (English)
String weekdayPashtoEnglish = shamsiCalendar.PashtoDayEnglishName(); // Output: "Manzinai"
This project is licensed under the MIT License – see the LICENSE file for details.