Panchang Core — Advanced Vedic Astrology Engine for PHP
Introduction
Authentic Vedic Panchanga calculation engine with Swiss Ephemeris precision.
Overview
Panchang Core is a comprehensive PHP package for calculating Vedic Panchanga elements, Muhūrtas, Karmakala windows, and Hindu festivals with high astronomical precision. Built on Swiss Ephemeris FFI, it provides a reusable calculation engine for authentic Vedic astrology applications.
Complete Panchanga
Tithi, Vara, Nakṣatra, Yoga, Karaṇa with precise fractions
237 Festival Definitions
Comprehensive library of festival definitions covering major and minor observances for all regions and traditions.
Muhūrta
Abhijit, Brahma Muhūrta, Rahu Kāla, Gulika, Yamaganda, Varjyam, Pradosha
Special Yogas
Sarvartha Siddhi, Amrit Siddhi, Ravi Yoga, Pushya variants, Dwipushkar, Tripushkar, Ganda Mula, Aadal, Vidaal, and Jwalamukhi.
Disha & Vaasa
Disha Shool, Nakshatra Shool, Rahu Vaasa, Chandra Vaasa, Shiva Vaasa, Agni Vaasa, and Yogini Vaasa for general panchang and electional screening.
Regional Support
Smarta, Vaishnava, North, South, Bengal, Maharashtra, Tamil traditions
Localization & Calendar Types
English, Hindi, and Gujarati localization with Amanta and Purnimanta month representation.
Classical Sources
Important: This is a source-integrity map, not a manuscript-critical proof. The codebase mixes direct conventions, package rule mappings, regional almanac conventions, modern references, and legacy helpers. For complete details, see docs/TRADITIONAL_TEXT_SOURCES.md.
Tier 1: Direct or Standard Panchang Conventions
| Source | Implementation |
|---|---|
| Sūrya Siddhānta 1.29 | Tithi calculation (30 lunar days, 12° each) |
| Sūrya Siddhānta 8.1 | Nakṣatra calculation (27 lunar mansions, 13°20' each) |
| Sūrya Siddhānta 3.1-3 | Yoga calculation (27 combinations, 13°20' Sun-Moon sum) |
| Muhūrta Chintāmaṇi Chapter 2 | Karana calculation (11 half lunar days, 6° each) |
| Sūrya Siddhānta 1.10-1.11 | Muhūrta, Ghaṭikā, Pala time units |
Tier 2: Package Rule Mappings
| Source | Implementation |
|---|---|
| Muhūrta Chintāmaṇi | Universal bad tithis, Vara-Tithi Yogas |
| Bṛhat Saṃhitā | Muhurta rules, Samvatsara, Ritu |
| Māyamata | Vāstu muhurta guidance |
| Vaikhānasa Āgama | Āgama-based muhurta guidance |
| Aśvalāyana Gṛhya Sūtra | Gṛhya-sūtra muhurta guidance |
| Muhūrta Mārtaṇḍa | Advanced muhurta calculations |
| Gargiya Jyotisha | Rikta Tithi dosha |
Tier 3: Festival-Resolution Logic
| Source | Implementation |
|---|---|
| Nirṇaya Sindhu | Festival timing, Bhadra rules |
| Muhūrta Chintāmaṇi | Aruṇodaya, Pradoṣa, Ekadashi handling |
| Hari Bhakti Vilāsa | Vaishnava Ekadashi rules |
Tier 4: Published Panchang Conventions
| Source | Implementation |
|---|---|
| Tamil Gowri/Pambu Panchangam | Gowri Panchangam (8-part day/night division) |
| Sarāvalī | Kala Vela rules (Rahu, Gulika, Yamaghantaka) |
| Aṣṭāṅga Hṛdaya | Brahma Muhurta timing |
| Charaka Saṃhitā | Muhurta concepts |
| Manusmṛti | Brahma Muhurta for Vedic study |
| Sandhyāvandanam Tradition | Sandhya windows (living tradition) |
Tier 5: Modern Systems
| Source | Implementation |
|---|---|
| Swiss Ephemeris | Planetary longitudes, Ayanāṃśa, Vara |
| KP System | Varjyam (Visha Ghati) calculation |
| Ernst Wilhelm's Classical Muhurta | Bhadra subdivisions |
What This Does NOT Claim
- ❌ Every package rule is 1:1 from a single primary text
- ❌ All regional or sectarian variants are covered
- ❌ Modern almanac conventions are identical across traditions
- ❌ Independent verification against critical Sanskrit editions
System Setup
Configuring PHP FFI and Swiss Ephemeris data files.
FFI Requirement
Panchang Core uses the PHP FFI extension to achieve maximum astronomical precision. This must be installed and enabled on your server.
1. Enable FFI Extension
Linux (Ubuntu/Debian)
sudo apt install php8.3-ffi
Linux (RHEL/CentOS)
sudo dnf install php-ffi
macOS (Homebrew)
Included by default in brew install php.
Windows
Included with PHP 8.3+. Enable in php.ini as shown below.
2. Configure php.ini
Add or uncomment high-privilege FFI settings in your php.ini:
extension=ffi
ffi.enable=1
3. Verify Setup
php -r "echo extension_loaded('ffi') ? 'FFI loaded' : 'FFI not loaded';"
php -r "echo ini_get('ffi.enable') ? 'FFI enabled' : 'FFI not enabled';"
📂 Ephemeris Data Files
The calculation engine requires .se1 data files. You can download the verified set from the official release page:
Download Ephe Files
Required for dates 3000 BCE – 3000 CE
Installation
composer require jayeshmepani/panchang-core
Requirements
- PHP 8.3+— uses typed constants, readonly classes, enums
- Swiss Ephemeris FFI— jayeshmepani/swiss-ephemeris-ffi
- Carbon— nesbot/carbon
- FFI Extension— required for Swiss Ephemeris
Quick Start
<?php
require 'vendor/autoload.php';
use JayeshMepani\PanchangCore\Traits\CliBootstrap;
use Carbon\CarbonImmutable;
// Initialize standalone environment (loads config & sets up DI)
CliBootstrap::init(__DIR__);
// Create fully wired PanchangService
$panchang = CliBootstrap::makePanchangService();
// Calculate panchanga
$date = CarbonImmutable::parse('2026-03-24');
$details = $panchang->getDayDetails(
date: $date,
lat: 23.2472446,
lon: 69.668339,
tz: 'Asia/Kolkata'
);
echo "Tithi: " . $details['Tithi']['name'] . "\n";
echo "Nakshatra: " . $details['Nakshatra']['name'] . "\n";
Configuration
Global settings and formatting preferences available in config/panchang.php.
Overview
When running inside Laravel, you can publish the configuration file to config/panchang.php.
These settings control default locale, calendar type, and representation formatting across package output
without truncating the raw calculation floats.
Default Calculation Options
The defaults array configures localization, calendar-system selection, and formatting
representations.
| Setting | Description | Acceptable Values |
|---|---|---|
locale |
Language used for localized names and descriptions. | en, hi, gu |
calendar_type |
Preferred lunar month naming system for representation. | amanta: month ends at Amavasyapurnimanta: month ends at Purnima |
measurement_system |
Unit system for generic dimensions and lengths. | indian_metric: Metric (meters, km)western: Imperial (feet, miles)
|
date_time_format |
String formatting of generic date-time outputs. | indian_12h: "24/03/2026 06:14:00 AM"indian_24h: "24/03/2026
06:14:00"iso8601: "2026-03-24T06:14:00+05:30" |
time_notation |
Global time output behavior (sunrise, sunset, muhurtas). | 12h: "06:14:00 AM"24h: "06:14:00" |
coordinate_format |
Format for geographical coordinates. | decimal: 23.2472446, 69.668339dms: "23°14'50.1\"N, 69°40'06.0\"E"
|
angle_unit |
Format for astronomical degrees (planet longitudes, Ascendant, Ayanamsa). | degree: 350.5234°dms: "350°31'24\"" |
duration_format |
How lengths of time are formatted. | mixed: "1h 30m 0s"minutes: 90.0seconds:
5400.0hours: 1.5 |
Festival Calculation Settings
The festivals array provides defaults for region and tradition if not explicitly supplied.
| Setting | Description | Acceptable Values |
|---|---|---|
default_tradition |
Default sect or tradition used to resolve conflicting festival rules. | Smarta, Vaishnava |
default_region |
Default geographical region for festival rule variations. | North, South, Bengal, Maharashtra,
Tamil, Gujarat
|
Cache Settings
The cache array controls package cache behavior in Laravel applications.
| Setting | Description | Default / Environment |
|---|---|---|
enabled |
Enable package cache. | PANCHANG_CACHE_ENABLED=true |
ttl |
Cache lifetime in seconds. | PANCHANG_CACHE_TTL=86400 |
prefix |
Cache key prefix. | PANCHANG_CACHE_PREFIX=panchang_ |
⚠️ Critical Implementation Notes
1. Panchang Day Context (Sunrise to Sunrise)
Most Important: In Vedic Panchang, a day runs from sunrise to next sunrise, NOT midnight to midnight. This affects:
- Tithi calculation: The tithi at sunrise determines the day's primary tithi
- Festival resolution: If a tithi ends before sunrise, it belongs to the previous Panchang day
- Time outputs: Times earlier than sunrise are dated to the next civil date
// Example: Sunrise at 6:14 AM
// Event at 5:30 AM belongs to NEXT Panchang day
$details = $panchang->getDayDetails($date, $lat, $lon, $tz);
// Times before sunrise in output are dated to next civil date
2. ISO Timestamps vs Time-Only Fields
All time-like fields include date-qualified companions with _iso suffix:
// Time-only (for display)
$varjyam_start = $details['Varjyam']['varjyam_start']; // "03:31:48 AM"
// Full ISO timestamp (for storage/database)
$varjyam_start_iso = $details['Varjyam']['varjyam_start_iso']; // "28/03/2026 03:31:48 AM"
// ALWAYS use _iso fields when:
// - Storing in database
// - Displaying to users
// - Comparing across timezones
3. Multiple Varjyam Windows
Varjyam can occur 0, 1, or 2 times per day depending on nakshatra transitions:
// Check how many windows exist
$windowCount = $details['Varjyam']['window_count']; // 0, 1, or 2
// Access all windows
foreach ($details['Varjyam']['windows'] as $window) {
echo $window['start'] . " - " . $window['end'];
}
// Top-level keys maintain backward compatibility
$details['Varjyam']['varjyam_start']; // First window start
$details['Varjyam']['varjyam_end']; // First window end
4. Pradosha Kaal Calculation
Pradosha is computed from two factors:
- Night fraction: First 1/5th of night (sunset to next sunrise)
- Trayodashi overlap: Only auspicious when Trayodashi tithi overlaps the window
// Returns both base and effective windows
$pradosha = $details['Pradosha_Kaal'];
$base_window = $pradosha['pradosha_window']; // Base 1/5th night
$effective = $pradosha['effective_trayodashi_window']; // Overlap with T13
5. Hindu Calendar Month Resolution
The package uses exact amavasya-to-amavasya solar transit logic:
- Amanta: Month ends at new moon (amavasya)
- Purnimanta: Month ends at full moon (purnima)
- Adhika Masa: Extra month when two amavasyas occur without solar transit
- Kshaya Masa: Lost month when no amavasya occurs in solar month (rare)
Note: Final month output can differ from simpler longitude-only heuristics used by other packages.
6. Karmakala Windows in getDayDetails()
The following dedicated Karmakala outputs are available:
$badTimes = $details['Rahu_Kaal_Gulika_Yamaganda'];
$abhijit = $details['Abhijit_Muhurta'];
$praharas = $details['Prahara_Full_Day'];
$daylight = $details['Daylight_Fivefold_Division']; // Pratah, Sangava, Madhyahna, Aparahna, Sayahna
$brahma = $details['Brahma_Muhurta'];
$dur = $details['Dur_Muhurta_Full_Day'];
$nishita = $details['Nishita_Muhurta']; // Night midpoint
$vijaya = $details['Vijaya_Muhurta']; // 11th of 15 day muhurtas
$godhuli = $details['Godhuli_Muhurta']; // Evening twilight
$sandhya = $details['Sandhya']; // Pratah, Madhyahna, Sayahna
$gowri = $details['Gowri_Panchangam']; // Tamil 8-part division
$kalaVela = $details['Kala_Vela']; // Kala, Mrityu, etc.
$karmakala = $details['Karmakala_Windows'];
$varjyam = $details['Varjyam'];
$amrita = $details['Amrita_Kaal'];
$pradosha = $details['Pradosha_Kaal'];
7. Special Yoga and Vaasa Outputs
Festival snapshots expose general panchang/electional signals without requiring consumers to rebuild the rule tables:
$specialYogas = $snapshot['Special_Yogas'];
$anandadi = $snapshot['Anandadi_Yoga'];
$amritadi = $snapshot['Amritadi_Yoga'];
$panchak = $snapshot['Panchak'];
$maitreya = $snapshot['Maitreya_Yoga'];
$gajachchhaya = $snapshot['Gajachchhaya_Yoga'];
$nakShool = $snapshot['Nakshatra_Shool'];
$dishaShool = $snapshot['Disha_Shool'];
$rahuVaasa = $snapshot['Rahu_Vaasa'];
$chandraVaasa = $snapshot['Chandra_Vaasa'];
$shivaVaasa = $snapshot['Shiva_Vaasa'];
$agniVaasa = $snapshot['Agni_Vaasa'];
$yoginiVaasa = $snapshot['Yogini_Vaasa'];
$ekadashi = $snapshot['Ekadashi_Observance'];
Nakshatra
Enum: JayeshMepani\PanchangCore\Core\Enums\Nakshatra
Represents the 27 lunar mansions in Vedic astrology. Each nakṣatra spans 13°20' of the zodiac.
Quick Usage
use JayeshMepani\PanchangCore\Core\Enums\Nakshatra;
// Get nakshatra from moon longitude
$nakshatra = Nakshatra::fromLongitude(125.3); // Magha
echo $nakshatra->getName(); // "Magha"
echo $nakshatra->getDeity(); // "Pitṛs"
echo $nakshatra->getRulingPlanet(); // "Sun"
echo $nakshatra->getSymbol(); // "Royal Throne"
// Get pada (quarter)
$pada = Nakshatra::getPada(125.3); // 2
echo "Pada: $pada\n"; // Pada: 2
// Get longitude range
$range = Nakshatra::Ashwini->getLongitudeRange();
echo $range['start'] . "° - " . $range['end'] . "°\n"; // 0° - 13.333°
Cases
AshwiniBharaniKrittikaRohiniMrigashiraArdraPunarvasuPushyaAshleshaMaghaPurvaPhalguniUttaraPhalguniHastaChitraSwatiVishakhaAnuradhaJyeshthaMulaPurvaAshadhaUttaraAshadhaShravanaDhanishtaShatabhishaPurvaBhadrapadaUttaraBhadrapadaRevatiMethods
getName()
Get Sanskrit name
public function getName(): stringstring— Sanskrit namegetDeity()
Get deity of the nakṣatra
public function getDeity(): stringstring— Deity namegetRulingPlanet()
Get ruling planet
public function getRulingPlanet(): stringstring— Planet namegetSymbol()
Get Vedic symbol
public function getSymbol(): stringstring— Symbol descriptiongetLongitudeRange()
Get Vedic longitude range
public function getLongitudeRange(): array{start: float, end: float}
array— Longitude range in degrees fromLongitude()
Get nakṣatra from longitude
public static function fromLongitude(float $longitude): self
$longitude(float) — Longitude in degrees (0–360)
self— Nakṣatra instancegetPada()
Get pada (quarter) from longitude
public static function getPada(float $longitude): int$longitude(float) — Longitude in degrees
int— Pada number (1–4)Tithi
Enum: JayeshMepani\PanchangCore\Core\Enums\Tithi
Represents the 30 lunar days in a Hindu lunar month. Each tithi is completed when the Moon gains 12° on the Sun.
Quick Usage
use JayeshMepani\PanchangCore\Core\Enums\Tithi;
// Get tithi by index (1-30)
$tithi = Tithi::from(12); // Shukla Dwadashi
echo $tithi->getName(); // "Dwadashi"
echo $tithi->getPaksha()->name; // "Shukla"
// Check paksha
if ($tithi->getPaksha() === Paksha::Shukla) {
echo "Waxing moon phase\n";
}
// Get normalized index (1-15 for both pakshas)
echo $tithi->getNormalizedIndex(); // 12
Cases
ShuklaPratipadaShuklaDwitiyaShuklaTritiyaShuklaChaturthiShuklaPanchamiShuklaShashthiShuklaSaptamiShuklaAshtamiShuklaNavamiShuklaDashamiShuklaEkadashiShuklaDwadashiShuklaTrayodashiShuklaChaturdashiPurnimaKrishnaPratipadaKrishnaDwitiyaKrishnaTritiyaKrishnaChaturthiKrishnaPanchamiKrishnaShashthiKrishnaSaptamiKrishnaAshtamiKrishnaNavamiKrishnaDashamiKrishnaEkadashiKrishnaDwadashiKrishnaTrayodashiKrishnaChaturdashiAmavasyaMethods
getName()
Get Sanskrit name
public function getName(): stringstring— Name (e.g., 'Shukla
Pratipada', 'Purnima')getPaksha()
Get pakṣa (fortnight)
public function getPaksha(): PakshaPaksha— Shukla or KrishnagetNormalizedIndex()
Get normalized index (1–15)
public function getNormalizedIndex(): intint— Index within pakṣaisEkadashi()
Check if this is Ekadashi
public function isEkadashi(): boolboolisPurnimaOrAmavasya()
Check if Purnima or Amavasya
public function isPurnimaOrAmavasya(): boolboolfromLongitudes()
Get tithi from Sun-Moon longitudes
public static function fromLongitudes(float $sunLon, float $moonLon): self
$sunLon(float) — Sun longitude in degrees$moonLon(float) — Moon longitude in degrees
selfgetFractionRemaining()
Get fraction remaining in tithi
public static function getFractionRemaining(float $sunLon, float $moonLon): float
float— Fraction (0.0–1.0)Paksha
Enum: JayeshMepani\PanchangCore\Core\Enums\Paksha
Represents the two fortnights in a lunar month.
Cases
Shukla = 0Krishna = 1Methods
getName()
Get Sanskrit name (localized)
public function getName(?string $locale = null): string$locale(string|null) — Locale code ('en', 'hi', 'gu'). Defaults to configured locale.
use JayeshMepani\PanchangCore\Core\Enums\Paksha;
$paksha = Paksha::Shukla;
echo $paksha->getName(); // "Shukla Paksha" (using configured locale)
echo $paksha->getName('hi'); // "शुक्ल पक्ष"
isShukla()
Check if this is the Shukla (bright) fortnight
public function isShukla(): boolisKrishna()
Check if this is the Krishna (dark) fortnight
public function isKrishna(): boolopposite()
Get the opposite paksha (Shukla ↔ Krishna)
public function opposite(): selfgetRawName()
Get raw programmatic name without localization
public function getRawName(): stringecho Paksha::Shukla->getRawName(); // "Shukla"
echo Paksha::Krishna->getRawName(); // "Krishna"
getDescription()
Get description
public function getDescription(): stringgetTithiRange()
Get tithi range
public function getTithiRange(): array{start: int, end: int}
containsTithi()
Check if tithi belongs to this pakṣa
public function containsTithi(int $tithiIndex): boolnormalizeTithi()
Normalize tithi to 1–15 range
public function normalizeTithi(int $tithiIndex): intYoga
Enum: JayeshMepani\PanchangCore\Core\Enums\Yoga
Represents the 27 yogas. Each yoga is completed when the Sun-Moon longitude sum advances by 13°20'.
Cases
VishkumbhaPritiAyushmanSaubhagyaShobhanaAtigandaSukarmaDhritiShulaGandaVriddhiDhruvaVyaghataHarshanaVajraSiddhiVyatipataVariyanaParighaShivaSiddhaSadhyaShubhaShuklaBrahmaIndraVaidhritiMethods
getName()
Get Sanskrit name (localized)
public function getName(?string $locale = null): string$locale(string|null) — Locale code ('en', 'hi', 'gu'). Defaults to configured locale.
fromLongitudes()
Get yoga from Sun-Moon longitudes
public static function fromLongitudes(float $sunLon, float $moonLon): self
getFractionRemaining()
Calculate the fraction of the current yoga that has elapsed
public static function getFractionRemaining(float $sunLon, float $moonLon): float
$sunLon(float) — Sun longitude in degrees.$moonLon(float) — Moon longitude in degrees.
float — Fraction from 0.0 to 1.0Karana
Enum: JayeshMepani\PanchangCore\Core\Enums\Karana
Represents the 11 karanas (half lunar days). Each tithi is divided into two karanas. Index values: 0-10 (normalized in v4.0 from 1-11).
Cases
Bava = 0Balava = 1Kaulava = 2Taitila = 3Gara = 4Vanija = 5Vishti = 6Shakuni = 7Chatushpada = 8Naga = 9Kintughna = 10Methods
getName()
Get Sanskrit name (localized)
public function getName(?string $locale = null): string$locale(string|null) — Locale code ('en', 'hi', 'gu'). Defaults to configured locale.
fromTithi()
Get karana from tithi
public static function fromTithi(int $tithiIndex, float $fraction): self
getFromLongitudes()
Get karana directly from Sun-Moon longitudes
public static function getFromLongitudes(float $sunLon, float $moonLon): array{0: self, 1: int}
$sunLon(float) — Sun longitude.$moonLon(float) — Moon longitude.
array — [Karana enum, index]Vara
Enum: JayeshMepani\PanchangCore\Core\Enums\Vara
Represents the 7 weekdays, each ruled by a planet.
Cases
SundayMondayTuesdayWednesdayThursdayFridaySaturdayMethods
getName()
Get Sanskrit name
public function getName(): stringgetEnglishName()
Get English name
public function getEnglishName(): stringgetRulingPlanet()
Get ruling planet
public function getRulingPlanet(): stringfromJulianDay()
Get weekday from Julian Day
public static function fromJulianDay(float $jd): selfCore Enums
Basic enumeration types used throughout the package.
Ritu (Seasons)
Represents the 6 Hindu seasons. Each ṛtu spans 2 lunar months.
Vasanta(Spring)Grishma(Summer)Varsha(Monsoon)Sharad(Autumn)Hemanta(Pre-Winter)Shishira(Winter)Methods
getName()
Get ritu name (localized)
public function getName(?string $locale = null): stringfromSunLongitude()
Get ritu from Sun longitude
public static function fromSunLongitude(float $sunLon): selfPanchangaEngine::getRitu($sunLon)returns
season from Sun longitudeMasa (Lunar Months)
Represents the 12 lunar months in the Hindu calendar.
ChaitraVaishakhaJyeshthaAshadhaShravanaBhadrapadaAshvinaKartikaMargashirshaPaushaMaghaPhalgunaMethods
getName()
Get masa name (localized)
public function getName(?string $locale = null): stringfromSunLongitude()
Get masa from Sun longitude
public static function fromSunLongitude(float $sunLon): selffromAmantaIndex()
Get masa from Amanta month index (0-11)
public static function fromAmantaIndex(int $index): selfPanchangaEngine::getHinduMonth($sunLon, $moonLon)
Samvatsara (60-Year Cycle)
Represents the 60 years in the Jupiter cycle.
PrabhavaVibhavaShuklaPramodaPrajapati… (60 total)PanchangaEngine::getSamvatsara($vikramSamvat)
Rasi (Zodiac Signs)
Represents the 12 zodiac signs in Vedic astrology.
Mesha(Aries)Vrishabha(Taurus)Mithuna(Gemini)Karka(Cancer)Simha(Leo)Kanya(Virgo)Tula(Libra)Vrischika(Scorpio)Dhanu(Sagittarius)Makara(Capricorn)Kumbha(Aquarius)Meena(Pisces)Vimshottari Dasha
Planetary periods in Vedic astrology, summing to 120 years.
Ketu(7 yr)Venus(20 yr)Sun(6 yr)Moon(10 yr)Mars(7 yr)Rahu(18 yr)Jupiter(16 yr)Saturn(19 yr)Mercury(17 yr)Muhurta
Represents the 30 divisions of a day (15 day + 15 night, approx 48 minutes each). Expanded from 15 to 30 cases in v4.0.
RudraAhiMitraPitriVasuVarahaVishvedevaVidhi… (30 total)MuhurtaService::calculateMuhurtaTable($sunrise, $sunset, $nextSunrise)
Methods
getName()
Get muhurta name (localized)
public function getName(?string $locale = null): stringgetDaySequence()
Get the 15 daytime muhurtas
public static function getDaySequence(): arraygetNightSequence()
Get the 15 nighttime muhurtas
public static function getNightSequence(): arrayChoghadiya
8 day and night time divisions primarily used in North & West India.
Udveg(Inauspicious)Chal(Neutral)Labh(Auspicious)Amrita(Very Auspicious)Kala(Inauspicious)Shubh(Auspicious)Rog(Inauspicious)MuhurtaService::calculateChogadiyaTable()
Hora
24 hourly planetary divisions of a day.
SunVenusMercuryMoonSaturnJupiterMarsMethods
getName()
Get hora name (localized)
public function getName(?string $locale = null): stringgetSequence()
Get the full 24-hour planetary hora sequence for a weekday
public static function getSequence(Vara $vara): array$vara(Vara) — Weekday enum.
array — Array of 24 Hora enums.toPlanetIndex()
Get planet index for localization mapping
public function toPlanetIndex(): intMuhurtaService::calculateHoraTable()— Each
hora spans ~1 hourCalendarType
Enum: JayeshMepani\PanchangCore\Core\Enums\CalendarType
Determines how lunar months are named and which festivals are observed. Amanta months end on Amavasya (New Moon), while Purnimanta months end on Purnima (Full Moon).
Cases
AmantaPurnimantaMethods
getLocalizedName()
Get the localized name for this calendar type.
public function getLocalizedName(?string $locale = null): string$locale(string|null) — Locale code ('en', 'hi', 'gu'). Defaults to null.
string — Localized calendar type name.use JayeshMepani\PanchangCore\Core\Enums\CalendarType;
$amanta = CalendarType::Amanta;
echo $amanta->getLocalizedName('hi'); // "अमांत"
isAmanta()
Check if this calendar follows the Amavasya-Ending system.
public function isAmanta(): boolbool — True for Amanta, false otherwise.isPurnimanta()
Check if this calendar follows the Purnima-Ending system.
public function isPurnimanta(): boolbool — True for Purnimanta, false otherwise.PanchangService
Service: JayeshMepani\PanchangCore\Panchanga\PanchangService
The primary facade-like service that orchestrates all underlying astronomical and astrological components to provide high-level daily and yearly details.
Public Methods
configure()
Configure the Swiss Ephemeris path for standalone usage.
public function configure(string $ephePath = ""): void
getDayDetails()
Returns exhaustive Panchanga and Muhurta details for a given date and location.
public function getDayDetails(CarbonImmutable $date, float $lat, float $lon, string $tz, float $elevation=0.0, ?CarbonImmutable $calculationAt=null, CalendarType|string $calendarType=CalendarType::Amanta, array $options=[]): array
getFestivalSnapshot()
A lightweight version of getDayDetails() containing only the data required for festival resolution.
public function getFestivalSnapshot(CarbonImmutable $date, float $lat, float $lon, string $tz, float $elevation=0.0, ?CarbonImmutable $calculationAt=null, CalendarType|string $calendarType=CalendarType::Amanta): array
getFestivalYearCalendar()
Builds a complete Gregorian-year calendar of festivals, correctly handling relative dates and consolidation.
public function getFestivalYearCalendar(int $year, float $lat, float $lon, string $tz, float $elevation=0.0, ?CarbonImmutable $calculationAt=null, CalendarType|string $calendarType=CalendarType::Amanta): array
getMonthCalendar()
Build a month-wise calendar summary with canonical festival orchestration, moon visibility fields, and compact daily Panchang snapshots.
public function getMonthCalendar(int $year, int $month, float $lat, float $lon, string $tz, float $elevation=0.0, array $options=[], ?CarbonImmutable $calculationAt=null, CalendarType|string $calendarType=CalendarType::Amanta): array
getElectionalSnapshot()
Return electional-analysis inputs built from day details, planetary states, sunrise context, and transit moorthy helpers.
public function getElectionalSnapshot(CarbonImmutable $date, float $lat, float $lon, string $tz, float $elevation=0.0, array $options=[]): array
getDailyMuhurtaEvaluation()
Checks current time against all doshas (Bhadra, Varjyam, Rahu Kaal, etc.) and returns a rejection report.
public function getDailyMuhurtaEvaluation(CarbonImmutable $date, float $lat, float $lon, string $tz, ?CarbonImmutable $currentAt=null, float $elevation=0.0, array $options=[]): array
FestivalService
Service: JayeshMepani\PanchangCore\Festivals\FestivalService
Calculates 237 Hindu festivals based on Tithi, Nakshatra, and complex regional traditions.
Methods
resolveFestivalsForDate()
The primary resolution method using triple-day context (yesterday, today, tomorrow) for high-precision boundaries.
public function resolveFestivalsForDate(CarbonImmutable $date, array $todayDetails, array $tomorrowDetails, ?array $yesterdayDetails = null, ?callable $fetchHistoricalSnapshot = null, bool $includeExtraWinners = false): array
$today = $panchang->getFestivalSnapshot(CarbonImmutable::parse('2026-03-24'), 23.247, 69.668, 'Asia/Kolkata');
$tomorrow = $panchang->getFestivalSnapshot(CarbonImmutable::parse('2026-03-25'), 23.247, 69.668, 'Asia/Kolkata');
$festivals = $festivalService->resolveFestivalsForDate(
CarbonImmutable::parse('2026-03-24'),
$today,
$tomorrow
);
foreach ($festivals as $festival) {
echo $festival['name'] . "\n";
}
buildFestivalPayload()
Build the canonical resolved festival object used by service and script outputs. It preserves raw rule keys for integrations while adding localized companion labels for human-facing JSON.
public function buildFestivalPayload(string $name, array $rules, ?array $resolved=null): array
getDailyObservances()
Return generic daily vrata/observance guidance (e.g. Pradosha, Ekadashi).
public function getDailyObservances(array $panchangDetails): array
getFestivalsForYear()
Intentionally disabled at this catalog layer. Year-wide festival output is built by PanchangService::getFestivalYearCalendar(), which owns location-aware Panchang orchestration.
public function getFestivalsForYear(int $year, string $pakshaSystem='Amanta'): array
LogicExceptionOutputGeneratorService
Service: JayeshMepani\PanchangCore\Panchanga\OutputGeneratorService
Designed for batch processing and CLI tools. It simplifies the creation of large JSON payloads for static site generation or mobile app bundling.
Batch Methods
generateTodayPanchang()
Generates a snapshot of everything happening "Right Now" including full day details and a muhurta evaluation.
public function generateTodayPanchang(float $lat, float $lon, string $tz, float $elevation=0.0, CalendarType|string $calendarType=CalendarType::Amanta): array
generateFestivals()
Generates a massive year-long JSON-ready array of every festival defined in the package.
public function generateFestivals(int $year, float $lat, float $lon, string $tz, float $elevation=0.0, CalendarType|string $calendarType=CalendarType::Amanta): array
generateEclipses()
Generates a list of all solar and lunar eclipses for a range of years.
public function generateEclipses(int $startYear, int $endYear, float $lat, float $lon, string $tz): array
generateAll()
Combines festivals, eclipses, and today's details into one final unified payload.
public function generateAll(int $festivalYear, int $eclipseStartYear, int $eclipseEndYear, float $lat, float $lon, string $tz, float $elevation=0.0, CalendarType|string $calendarType=CalendarType::Amanta): array
configure()
Global configuration for the service (typically used in standalone mode).
public static function configure(string $ephePath): void
$ephePath(string) — Absolute path to ephemeris files
Output Notes
Hindu_Calendarin service output includesMonth_Amanta,Month_Purnimanta,Is_Adhika,Is_Kshaya,Amanta_Index, andPurnimanta_Index.- Service-level month resolution uses exact solar transit boundaries between amavasyas for final day output.
- Saṅkrānti tagging is mapped to civil-day ingress (00:00-24:00 local date), so pre-sunrise ingress remains on that same calendar date.
- Empty arrays such as
Bhadra: []orDharma_Sindhu: []are valid when no applicable window exists for that Panchang day. - The verified festival catalog currently contains
237definitions after merging true alias/variant duplicates; distinct festivals that fall on the same tithi remain separate entries. - Named Karmakala windows are exposed directly in
Karmakala_Windowsso festival-sidekarmakala_typeconcepts such assunrise,madhyahna,aparahna,pradosha, andnishithamap cleanly to daily output.
AstronomyService
Service: JayeshMepani\PanchangCore\Astronomy\AstronomyService
High-precision astronomical engine powered by Swiss Ephemeris FFI.
Methods
getPlanets()
Returns absolute tropical longitudes for all major planets at a given timestamp.
public function getPlanets(array $birth): arraygetPlanetaryStates()
Returns a detailed state map for each planet including sign index, speed, and status flags.
public function getPlanetaryStates(array $birth, string $nodeMode = 'mean', float $stationTolerance = 1.0e-6): arrayarray{planet_name: {longitude, sign_index, sign_name, speed, is_retrograde, is_combust, is_stationary}}getAscendant()
Calculates the precise longitude of the Ascendant (Lagna) for the given coordinates and time.
public function getAscendant(array $birth): floatSunService
Service: JayeshMepani\PanchangCore\Astronomy\SunService
Dedicated engine for solar/lunar rise and set timings and local time divisions.
Methods
getSunriseSunset() / getMoonriseMoonset()
Calculates rise/set times with sub-second precision.
public function getSunriseSunset(array $birth): arraypublic function getMoonriseMoonset(array $birth): arraygetIshtkaal()
Calculates Ishtkaal (Vedic time elapsed since local sunrise).
public function getIshtkaal(CarbonImmutable $currentTime, CarbonImmutable $sunrise): stringgetDaylightFivefoldDivision()
Divides the day into Pratah, Sangava, Madhyahna, Aparahna, and Sayahna windows.
public function getDaylightFivefoldDivision(CarbonImmutable $sunrise, CarbonImmutable $sunset): arraygetSolarTransits()
Calculates the local solar noon and transit boundaries for the observer.
public function getSolarTransits(array $birth): arrayPanchangaEngine
Service: JayeshMepani\PanchangCore\Panchanga\PanchangaEngine
Core panchanga calculation engine for tithi, yoga, karana, and seasonal logic (no ephemeris dependencies).
Methods
calculateTithi()
Calculate Tithi from Sun and Moon longitudes.
public function calculateTithi(float $sunLon, float $moonLon): array
$sunLon(float) — Sun longitude in degrees.$moonLon(float) — Moon longitude in degrees.
array —
{index, name, paksha, fraction_left}
$tithi = $engine->calculateTithi(350.5, 125.3);
echo $tithi['name']; // "Dwadashi"
getNakshatraInfo()
Determine Nakshatra and Pada from a specific longitude.
public function getNakshatraInfo(float $longitude): array
$longitude(float) — Celestial longitude in degrees.
array — [name, pada, lord]
calculateYoga()
Calculate Yoga from the sum of Sun and Moon longitudes.
public function calculateYoga(float $sunLon, float $moonLon): array
$sunLon(float) — Sun longitude.$moonLon(float) — Moon longitude.
array — {index, name}getKarana()
Get the Karana (half-tithi) from celestial longitudes.
public function getKarana(float $sunLon, float $moonLon): array
$sunLon(float) — Sun longitude.$moonLon(float) — Moon longitude.
array — [name, number]
calculateVara()
Calculate weekday (Vara) relative to local sunrise.
public function calculateVara(array $birth, SunService $sunService): array
$birth(array) — Timestamp details with location and time.$sunService(SunService) — Helper for sunrise timing.
array — {index, name, lord}
getRitu()
Identify the Vedic season (Ritu) based on solar longitude.
public function getRitu(float $sunLon): string
$sunLon(float) — Sun longitude.
string — Sanskrit name of the season
(e.g., "Sharad").getAyana()
Identify the solar hemisphere (Uttarayana or Dakshinayana).
public function getAyana(float $sunLon): string
$sunLon(float) — Sun longitude.
string — "Uttarayana" or "Dakshinayana".
getSamvat()
Calculate Vikram Samvat and Saka Samvat years.
public function getSamvat(int $year, int $month): array
$year(int) — Gregorian year.$month(int) — Gregorian month (1-12).
array —
{Vikram_Samvat, Saka_Samvat}getSamvatsara()
Identify the Samvatsara name in the 60-year Jupiter cycle.
public function getSamvatsara(int $vikramSamvat): string
$vikramSamvat(int) — Vikram Samvat year.
string — Samvatsara name.getHinduMonth()
Identify the Hindu lunar month for a given moment.
public function getHinduMonth(float $sunLon, float $moonLon, string $paksha='Shukla'): array
$sunLon(float) — Sun longitude.$moonLon(float) — Moon longitude.$paksha(string) — Current lunar phase.
array —
{Amanta, Purnimanta, Amanta_Index, Purnimanta_Index}Note: This method documents the simpler PanchangaEngine month helper.
Final PanchangService day output uses a stricter true-month resolution based on exact
amavasya and sankranti boundaries, and therefore also exposes flags such as Is_Adhika and
Is_Kshaya.
getSamvatsaraNorth()
Calculate North Indian Samvatsara name (variant cycle).
public function getSamvatsaraNorth(int $vikramSamvat): string
$vikramSamvat(int) — Vikram Samvat year.
string — North Samvatsara name.getKaliSamvat()
Calculate the year in the Kali Yuga era.
public function getKaliSamvat(int $vikramSamvat): int
$vikramSamvat(int) — Vikram Samvat year.
int — Kali Samvat year.getGujaratiSamvat()
Calculate the year in the Gujarati (Kartikadi) Samvat era.
public function getGujaratiSamvat(int $vikramSamvat, int $monthIdx): int
$vikramSamvat(int) — Vikram Samvat year.$monthIdx(int) — Month index (0-11).
int — Gujarati Samvat year.calculatePanchakaRahita()
Calculate Panchaka Rahita status for Muhurta selection (classical residual logic).
public function calculatePanchakaRahita(int $tithi, int $vara, int $nak, int $lagna): array
$tithi(int) — Tithi index.$vara(int) — Weekday index.$nak(int) — Nakshatra index.$lagna(int) — Lagna index.
array —
{status, classification}calculateKundaLagna()
Calculate Kunda Lagna (Ascendant * 81) used for birth time rectification.
public function calculateKundaLagna(float $ascendantLongitude): array
$ascendantLongitude(float) — Longitude of the Ascendant.
array — {degrees, rasi}
isVishtiKarana()
Determine if the current moment falls under the inauspicious Vishti Karana (Bhadra).
public function isVishtiKarana(float $sunLon, float $moonLon): bool
$sunLon(float) — Sun longitude.$moonLon(float) — Moon longitude.
bool — True if Bhadra is active.CliBootstrap
Trait: JayeshMepani\PanchangCore\Traits\CliBootstrap
CLI Bootstrap trait for streamlined CLI script setup and service dependency injection. Sets up env(), config(), and the DI container so the package works without a full Laravel framework.
Usage in Scripts
require __DIR__ . '/vendor/autoload.php';
CliBootstrap::init(__DIR__);
$panchangService = CliBootstrap::makePanchangService();
Static Methods
init()
Set up the standalone environment. Call this once at the top of a script.
public static function init(string $baseDir): void$baseDir(string) — Directory containing vendor/autoload.php and config/
voidCliBootstrap::init(__DIR__);
makePanchangService()
Create a fully wired PanchangService for standalone usage.
public static function makePanchangService(): PanchangServicePanchangService — Fully configured service instance.$panchangService = CliBootstrap::makePanchangService();
makeEclipseService()
Create an EclipseService.
public static function makeEclipseService(): EclipseServiceEclipseServicemakeOutputGenerator()
Create an OutputGeneratorService.
public static function makeOutputGenerator(PanchangService $panchang): OutputGeneratorService$panchang(PanchangService) — PanchangService instance
OutputGeneratorServiceMuhurtaService
Service: JayeshMepani\PanchangCore\Panchanga\MuhurtaService
Advanced engine for time-based divisions, auspicious periods, and negative time clusters.
Methods
calculateHora()
Return the currently active Hora at the supplied calculation moment.
public function calculateHora(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, CarbonImmutable $birthAt, int $varaIdx): array
calculateChogadiya()
Return the currently active Chogadiya at the supplied calculation moment.
public function calculateChogadiya(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, CarbonImmutable $birthAt, int $varaIdx): array
calculateMuhurtaTable()
Calculate all 30 named Muhurtas for a full 24-hour cycle.
public function calculateMuhurtaTable(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise): array
$sunrise(CarbonImmutable) — Current day sunrise.$sunset(CarbonImmutable) — Current day sunset.$nextSunrise(CarbonImmutable) — Next day sunrise.
array — 30 muhurta objects with
{name, start, end}.calculateChogadiyaTable()
Calculate 8 day and 8 night Chogadiya periods.
public function calculateChogadiyaTable(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, int $varaIdx): array
$sunrise(CarbonImmutable) — Sunrise time.$sunset(CarbonImmutable) — Sunset time.$nextSunrise(CarbonImmutable) — Next sunrise time.$varaIdx(int) — Weekday index (0-6).
array — Detailed list of 16 Chogadiya
divisions.calculateDaylightFivefoldDivision()
Calculate the canonical five daylight divisions: Pratah, Sangava, Madhyahna, Aparahna, and Sayahna.
public function calculateDaylightFivefoldDivision(CarbonImmutable $sunrise, CarbonImmutable $sunset): array
calculateNishitaMuhurta()
Calculate the 8th of 15 night Muhurtas centered on the night midpoint.
public function calculateNishitaMuhurta(CarbonImmutable $sunset, CarbonImmutable $nextSunrise): array
calculateVijayaMuhurta()
Calculate the 11th of 15 daytime Muhurtas.
public function calculateVijayaMuhurta(CarbonImmutable $sunrise, CarbonImmutable $sunset): array
calculateGodhuliMuhurta()
Calculate the evening twilight Godhuli Muhurta near sunset.
public function calculateGodhuliMuhurta(CarbonImmutable $sunset, CarbonImmutable $nextSunrise): array
calculateSandhya()
Calculate Pratah, Madhyahna, and Sayahna Sandhya windows.
public function calculateSandhya(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, CarbonImmutable $solarNoon): array
calculateGowriPanchangam()
Calculate weekday-specific Gowri Panchangam day and night divisions.
public function calculateGowriPanchangam(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, int $varaIdx): array
calculateKalaVela()
Calculate Kala Vela day/night divisions and named Kala Vela windows.
public function calculateKalaVela(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, int $varaIdx): array
calculateHoraTable()
Identify the 24 planetary Hora rulers for the day.
public function calculateHoraTable(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, int $varaIdx): array
$sunrise(CarbonImmutable) — Sunrise time.$sunset(CarbonImmutable) — Sunset time.$nextSunrise(CarbonImmutable) — Next sunrise time.$varaIdx(int) — Weekday index (0-6).
array — 24 Hora objects with
{planet, start, end}.calculateAbhijitMuhurta()
Determine the most auspicious midday period (Abhijit).
public function calculateAbhijitMuhurta(CarbonImmutable $sunrise, CarbonImmutable $sunset): array
$sunrise(CarbonImmutable) — Sunrise time.$sunset(CarbonImmutable) — Sunset time.
array —
{start, end, duration}.calculateBrahmaMuhurta()
Identify the pre-dawn auspicious period (Brahma Muhurta).
public function calculateBrahmaMuhurta(CarbonImmutable $sunrise): array
$sunrise(CarbonImmutable) — Sunrise time.
array — {start, end, name}
calculateLagna()
Calculate the current sidereal Lagna/ascendant sign for one timestamp and location.
public function calculateLagna(CarbonImmutable $current, CarbonImmutable $sunrise, float $sunriseSunLongitude, float $ayanamsaDeg, float $lat, float $lon, SwissEphFFI $sweph): array
array — Current Lagna longitude,
sign index/name, degree in sign, and applied ayanamsa.calculateLagnaTable()
Calculate full 12/13 Lagna (Ascendant) intervals for the day with exact sign entry times.
public function calculateLagnaTable(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, float $sunriseSunLon, float $ayanamsa, float $lat, float $lon, SwissEphFFI $sweph): array
$sunrise, $sunset, $nextSunrise(CarbonImmutable) — Boundary timestamps.$sunriseSunLon(float) — Sun longitude at sunrise.$ayanamsa(float) — Calculation offset.$lat, $lon(float) — Coordinates.
array — List of sign durations with
start/end times.calculatePrahara()
Calculate 8 Prahara (4 day + 4 night) as per Srimad Bhagavata Purana.
public function calculatePrahara(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise): array
$sunrise, $sunset, $nextSunrise(CarbonImmutable) — Boundary timestamps.
array — 8 canonical Prahara periods.
calculateDurMuhurta()
Identify specific inauspicious Muhurtas from the daily 30-period table.
public function calculateDurMuhurta(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, int $varaIdx): array
$sunrise, $sunset, $nextSunrise(CarbonImmutable) — Boundary timestamps.$varaIdx(int) — Weekday index.
array — List of Dur-Muhurta periods.
calculateVarjyam()
Calculate one Varjyam (Tyajyam) window for a specific Nakshatra span.
public function calculateVarjyam(CarbonImmutable $sunrise, CarbonImmutable $sunset, CarbonImmutable $nextSunrise, int $nakIdx, float $nakStartJd, float $nakEndJd): array
$sunrise, $sunset, $nextSunrise(CarbonImmutable) — Boundary timestamps.$nakIdx(int) — Nakshatra index.$nakStartJd, $nakEndJd(float) — Nakshatra span boundaries.
array — Varjyam window payload for that
Nakshatra. Day-level aggregation is done in PanchangService.calculateAmritaKaal()
Calculate Amrita Kaal (auspicious period — opposite of Varjyam).
public function calculateAmritaKaal(CarbonImmutable $sunrise, array $varjyam): array
$sunrise(CarbonImmutable) — Sunrise time.$varjyam(array) — Calculated Varjyam results.
array —
{amrita_kaal_start, amrita_kaal_end, duration_minutes}calculatePradoshaKaal()
Legacy helper around sunset. Full Trayodashi-overlap Pradosha logic in day
output is computed by PanchangService.
public function calculatePradoshaKaal(CarbonImmutable $sunset, int $tithiNum): array
$sunset(CarbonImmutable) — Sunset time.$tithiNum(int) — Absolute Tithi index.
array — Pradosha timings.calculateBadTimes()
Calculate Rahu Kala, Gulika, and Yamaganda for a given day.
public function calculateBadTimes(CarbonImmutable $sunrise, CarbonImmutable $sunset, int $varaIdx): array
$sunrise, $sunset(CarbonImmutable) — Sunrise/Sunset.$varaIdx(int) — Weekday index.
array — Set of bad time intervals.EclipseService
Service: JayeshMepani\PanchangCore\Astronomy\EclipseService
Predict solar and lunar eclipses with sub-second precision, including contact times, magnitudes, and visibility assessment.
Methods
getEclipsesForYear()
Find all eclipses occurring in a specific calendar year globally or for a location.
public function getEclipsesForYear(int $year, float $lat, float $lon, string $tz): array
$year(int) — Gregorian year.$lat, $lon(float) — Coordinates.$tz(string) — Timezone.
array — List of eclipse events with
times, type, and visibility.BhadraEngine
Service: JayeshMepani\PanchangCore\Festivals\Utils\BhadraEngine
Advanced Bhadra (Vishti Karana) analysis according to Muhūrta Chintāmaṇi and Nirṇaya Sindhu.
Methods
calculateBhadra()
Calculate Bhadra subdivisions (Mukha, Madhya, Puchha) and location (Bhadravāsa/Lok).
public function calculateBhadra(float $sunriseJd, float $vishtiStartJd, float $vishtiEndJd, int $moonRasi, int $tithi, string $paksha): array
$sunriseJd(float) — Julian Day of sunrise.$vishtiStartJd(float) — Julian Day of Vishti Karana start.$vishtiEndJd(float) — Julian Day of Vishti Karana end.$moonRasi(int) — Moon's Rasi (sign) index.$tithi(int) — Tithi index.$paksha(string) — 'Shukla' or 'Krishna'.
array— {mukha, madhya, puchha, lok,
status}
ElectionalEvaluator
Service: JayeshMepani\PanchangCore\Panchanga\ElectionalEvaluator
The calculation engine for classical electional (Muhurta) doshas and transit classifications.
Static Methods
calculatePanchakaDosha()
Calculates the 5-fold Panchaka classification based on Tithi, Vara, Nakshatra, and Lagna.
public static function calculatePanchakaDosha(int $tithiNumber, int $varaNumber, int $nakshatraNumber, int $lagnaNumber): array
array{remainder: int, classification: string, is_auspicious: bool}calculateDagdhaTithi() / calculateDagdhaYoga()
Checks if current weekday/tithi/moon-sign combinations result in 'Burnt' (Dagdha) status.
public static function calculateDagdhaTithi(int $tithiNumber, int $moonSignIdx): arraypublic static function calculateDagdhaYoga(int $varaNumber, int $tithiNumber): array
calculateRiktaTithi()
Identifies if the tithi is a 'Rikta' (Empty) tithi (4, 9, 14).
public static function calculateRiktaTithi(int $tithiNumber, bool $isKrishnaPaksha): array
calculateTransitMoorthy()
Classifies planetary transit quality (Gold, Silver, Copper, Iron) relative to the Moon's sign.
public static function calculateTransitMoorthy(string $nakshatraName): array
array{quality: string, label: string, is_auspicious: bool}calculateBhadra()
Checks if Bhadra (Vishti Karana) is active based on moon sign index.
public static function calculateBhadra(int $moonSignIdx): arraycalculateVarjyam() / calculateAmritaKaal()
Static calculation for Visha Ghati and its corresponding auspicious window.
public static function calculateVarjyam(int $nakshatraNumber, float $nakshatraStartTime, float $nakshatraDurationMinutes): arraypublic static function calculateAmritaKaal(int $varaNumber, float $sunrise, float $sunset, float $nextSunrise, float $currentTime): array
calculateAbhijitCancellation()
Checks if Abhijit Muhurta is cancelled due to a Wednesday (Budhavara).
public static function calculateAbhijitCancellation(float $sunrise, float $sunset, int $varaNumber, float $currentTime): arraygenerateRejectionReport()
Takes a bundle of evaluation results and generates a human-readable list of active doshas and an overall verdict.
public static function generateRejectionReport(array $evaluationResults): array
KalaNirnayaEngine
Service: JayeshMepani\PanchangCore\Panchanga\KalaNirnayaEngine
Advanced engine for resolving festival dates based on Punya Kaal, Viddha Tithi, and complex religious timing priorities.
Public Methods
determineEkadashi()
Resolves Smarta vs Vaishnava Ekadashi dates based on Arunodaya and Dashami-overlap rules.
public function determineEkadashi(CarbonImmutable $date, array $panchangData): array
calculatePunyaKaal()
Identifies the auspicious 'Punya Kaal' window for Sankrantis.
public function calculatePunyaKaal(string $sankrantiName, float $sankrantiJd, float $sunriseJd, float $sunsetJd): array
generateKalaNirnayaReport()
Generates a detailed report explaining WHY a specific festival was resolved to a specific day.
public function generateKalaNirnayaReport(string $festivalName, CarbonImmutable $date, array $panchangDetails): array
VimshottariDasha
Enum: JayeshMepani\PanchangCore\Core\Enums\VimshottariDasha
Calculates planetary periods (Dashas) based on birth Nakshatra.
Methods
getName()
Get dasha name (localized)
public function getName(?string $locale = null): stringfromNakshatra()
Identifies the starting Dasha lord.
public static function fromNakshatra(Nakshatra $nak): selfgetDashaYears()
Returns the planetary duration in years.
public function getDashaYears(): intJSON Response Schema
Complete reference of keys returned by the getDayDetails() "God Object".
v4.0.0 Breaking Change: Inside the nested Panchanga block, Sunrise, Sunset, Moonrise, and Moonset are now objects. Top-level convenience fields such as Sunrise and Moonrise still expose formatted strings.
Core Panchang
Tithi— {index, name, paksha, paksha_name, end, end_iso, fraction_remaining}Nakshatra— {index, name, lord, pada, end, end_iso, fraction_remaining}Yoga— {index, name, end, end_iso}Karana— {index, name, number, end, end_iso}Vara— {index, name, lord}
Sun & Moon (Structured Objects)
Sunrise / Sunset— {jd, iso, display, timestamp}Moonrise / Moonset— {jd, iso, display, timestamp}Ishtkaal— (Local time elapsed since sunrise)Sun_Longitude / Moon_Longitude— (Decimal Degrees)Sun_Sign / Moon_Sign— {index, name}
Auspicious & Inauspicious Windows
| Key | Type | Structure |
|---|---|---|
Abhijit_Muhurta | Object | {start, end, duration} |
Brahma_Muhurta | Object | {start, end, name} |
Rahu_Kaal_Gulika_Yamaganda | Object | {rahu_kaal: {start, end}, gulika, yamaganda} |
Varjyam | Object | {window_count, windows: [{start, end, start_iso, end_iso}]} |
Amrita_Kaal | Object | {window_count, windows: [...]} |
Pradosha_Kaal | Object | {pradosha_window, effective_trayodashi_window} |
Bhadra | Array|null | [{name, start, end, mukha, madhya, puchha, lok, status}] |
CLI Tooling & Scripts
Built-in scripts for rapid data generation, batch processing, and data export.
All scripts utilize the CliBootstrap trait for environment-aware dependency injection. Use these for generating JSON data suitable for static sites, mobile apps, or offline use.
Available Scripts
| Script | Description | Output |
|---|---|---|
panchang_today.php |
Generates today's complete panchang and muhurta evaluation | today_panchang.json |
panchang_festivals.php [year] |
Exports all festivals for a given year | festivals_YYYY.json |
panchang_eclipses.php [start] [end] |
Exports eclipses for a range of years | eclipses_YYYY_YYYY.json |
panchang_month_output.php [year] [month] |
Exports monthly panchang data; defaults to current month when no year/month is passed | Prints to stdout |
panchang_raw_output.php |
Combines today's data, festivals, and eclipses | meta.json, festivals_YYYY.json, etc. |
Usage Examples
cd scripts
php panchang_today.php
cd scripts
php panchang_festivals.php 2026
cd scripts
php panchang_month_output.php 2026 4 > month_2026_04.json
Localization and Calendar Types
Use environment variables to control output format:
PANCHANG_LOCALE=hi PANCHANG_CALENDAR_TYPE=purnimanta php panchang_today.php
Supported locales: en, hi, gu. Calendar types: amanta, purnimanta.
Configuration
Complete reference for config/panchang.php.
| Key | Type | Default | Description |
|---|---|---|---|
ephe_path |
string | __DIR__ . '/../ephe' |
Path to Swiss Ephemeris .se1 files. |
defaults.locale |
string | 'en' |
Output localization. Supported values: en, hi, gu. |
defaults.calendar_type |
string | 'amanta' |
Preferred lunar month representation. Supported values: amanta,
purnimanta. |
defaults.measurement_system |
string | 'indian_metric' |
Unit system for generic measurements. |
defaults.date_time_format |
string | 'indian_12h' |
Date-time output format. |
defaults.time_notation |
string | '12h' |
Time output notation. |
festivals.default_tradition |
string | 'Smarta' |
Default tradition used for festival resolution. |
festivals.default_region |
string | 'North' |
Default region used for festival resolution. |
festivals.supported_traditions |
array | ['Smarta', 'Vaishnava'] |
Supported tradition identifiers for consumer-side validation. |
festivals.supported_regions |
array | ['North', 'South', 'Bengal', 'Maharashtra', 'Tamil', 'Gujarat'] |
Supported region identifiers for consumer-side validation. |
defaults.coordinate_format |
string | 'decimal' |
Coordinate output format. |
defaults.angle_unit |
string | 'degree' |
Angle formatting for longitudes and ayanamsa. |
defaults.duration_format |
string | 'mixed' |
Duration formatting mode. |
cache.enabled |
bool | true |
Enable package caching. |
cache.ttl |
int | 86400 |
Cache time-to-live in seconds. |
cache.prefix |
string | 'panchang_' |
Cache key prefix. |
Batch Processing
Efficiently generating large JSON datasets for applications.
If you are building a static website or a mobile app that needs to work offline, use OutputGeneratorService to export pre-calculated data.
use JayeshMepani\PanchangCore\Panchanga\OutputGeneratorService;
$generator = app(OutputGeneratorService::class);
// 1. Export 10 years of eclipses
$eclipses = $generator->generateEclipses(2025, 2035, 23.24, 69.66, 'Asia/Kolkata');
// 2. Export full year of festivals
$festivals = $generator->generateFestivals(2026, 23.24, 69.66, 'Asia/Kolkata');
// 3. One massive unified export
$all = $generator->generateAll(2026, 2026, 2030, 23.24, 69.66, 'Asia/Kolkata');
Localization
Multilingual support for English, Hindi, and Gujarati.
The package automatically translates all display names (Tithi, Nakshatra, Ritu, etc.) and descriptions based on the defaults.locale config or environment variable.
Switching Locales at Runtime
// Using environment variables (Global)
putenv('PANCHANG_LOCALE=gu');
// The output of any service will now use Gujarati script
$details = Panchang::getDayDetails($date, $lat, $lon, $tz);
echo $details['Tithi']['name']; // "વદ તેરસ"
Direct Localization Usage
Use the Localization class directly for custom translations:
use JayeshMepani\PanchangCore\Core\Localization;
// Get translated Nakshatra name
$nakshatraName = Localization::translate('Nakshatra', 'Ashwini', 'hi'); // "अश्विनी"
// Get translated Tithi
$tithiName = Localization::translate('Tithi', 15, 'gu'); // "પૂનમ"
// Available categories: Nakshatra, Vara, Tithi, Rasi, Yoga, Karana, Choghadiya, Muhurta, Masa, Paksha, Ritu, Ayana, Planet, Samvatsara, Vrata, Eclipse, Festival
Supported Languages
- en — English
- hi — Hindi (Devanagari script)
- gu — Gujarati (Gujarati script)
The Localization class contains comprehensive translations for all panchang elements, including festival names, planetary names, and astrological terms.
Usage Patterns (How do I...?)
Practical code snippets for specific needs.
I only want today's Tithi name
$details = Panchang::getDayDetails($date, $lat, $lon, $tz);
echo "Today is: " . $details['Tithi']['name'];
I want to check if Bhadra (Vishti) is active right now
$eval = Panchang::getDailyMuhurtaEvaluation($date, $lat, $lon, $tz, CarbonImmutable::now());
if ($eval['evaluation_results']['bhadra']['is_active']) {
echo "Bhadra is active!";
}
I want to get the start and end time of a specific Nakshatra
$details = Panchang::getDayDetails($date, $lat, $lon, $tz);
echo "Starts: " . $details['Nakshatra']['start_iso'];
echo "Ends: " . $details['Nakshatra']['end_iso'];
Constants & Enums
Available options for calculation parameters.
Ayanamsa System
LAHIRI— Chitra Paksha (fixed, mandatory for this package)
Traditions
Smarta— Standard Dharmasindhu rulesVaishnava— ISKCON/Gaudiya rules
Regions
North— Purnimanta calendar (UP, Delhi, Rajasthan)South— Amanta calendar (Karnataka, Andhra, TN)Maharashtra,Gujarat— Regional variationsBengal— Solar calendar variations
Laravel Integration
Complete guide for using Panchang Core in Laravel applications.
Installation
composer require jayeshmepani/panchang-core
Configuration
Publish the configuration file:
php artisan vendor:publish --provider="JayeshMepani\PanchangCore\PanchangServiceProvider" --tag="panchang-config"
This creates config/panchang.php:
return [
'ephe_path' => env('PANCHANG_EPHE_PATH', __DIR__ . '/../ephe'),
'defaults' => [
'locale' => env('PANCHANG_LOCALE', 'en'),
'calendar_type' => env('PANCHANG_CALENDAR_TYPE', 'amanta'),
'measurement_system' => 'indian_metric',
'date_time_format' => 'indian_12h',
'time_notation' => '12h',
'coordinate_format' => 'decimal',
'angle_unit' => 'degree',
'duration_format' => 'mixed',
],
'festivals' => [
'default_tradition' => 'Smarta',
'default_region' => 'North',
'supported_traditions' => ['Smarta', 'Vaishnava'],
'supported_regions' => ['North', 'South', 'Bengal', 'Maharashtra', 'Tamil', 'Gujarat'],
],
'cache' => [
'enabled' => true,
'ttl' => 86400,
'prefix' => 'panchang_',
],
];
Using the Facade
use JayeshMepani\PanchangCore\Facades\Panchang;
use Carbon\CarbonImmutable;
// Get complete panchanga
$details = Panchang::getDayDetails(
date: CarbonImmutable::parse('2026-03-24'),
lat: 23.2472,
lon: 69.6683,
tz: 'Asia/Kolkata'
);
echo $details['Tithi']['name']; // "Dwadashi"
echo $details['Nakshatra']['name']; // "Magha"
Service Container
Or inject via constructor:
use JayeshMepani\PanchangCore\Panchanga\PanchangService;
class PanchangController extends Controller
{
public function __construct(
private PanchangService $panchang
) {}
public function show()
{
$details = $this->panchang->getDayDetails(
date: CarbonImmutable::now(),
lat: 28.6139,
lon: 77.2090,
tz: 'Asia/Kolkata'
);
return view('panchang', compact('details'));
}
}
Return Value Structures
Complete data structures returned by main methods.
getDayDetails() Return Structure
[
'Display_Settings' => [...],
'Units' => [...],
'Tithi' => ['index' => 12, 'name' => 'Dwadashi', 'paksha' => 'Shukla'],
'Nakshatra' => ['index' => 10, 'name' => 'Magha', 'pada' => 2, 'lord' => 'Sun'],
'Yoga' => ['index' => 9, 'name' => 'Shula'],
'Karana' => ['index' => 23, 'name' => 'Bava'],
'Vara' => ['index' => 2, 'name' => 'Tuesday', 'lord' => 'Mars'],
'Hindu_Calendar' => [
'Month_Amanta' => 'Chaitra',
'Month_Purnimanta' => 'Chaitra',
'Is_Adhika' => false,
'Is_Kshaya' => false,
'Amanta_Index' => 1,
'Purnimanta_Index' => 1,
],
'Rahu_Kaal_Gulika_Yamaganda' => [...],
'Abhijit_Muhurta' => [...],
'Hora_Full_Day' => [...],
'Chogadiya_Full_Day' => [...],
'Muhurta_Full_Day' => [...],
'Prahara_Full_Day' => [...],
'Lagna_Full_Day' => [...],
'Dur_Muhurta_Full_Day' => [...],
'Daylight_Fivefold_Division' => [...],
'Nishita_Muhurta' => [...],
'Vijaya_Muhurta' => [...],
'Godhuli_Muhurta' => [...],
'Sandhya' => [...],
'Gowri_Panchangam' => [...],
'Kala_Vela' => [...],
'Karmakala_Windows' => [...],
'Varjyam' => [...],
'Amrita_Kaal' => [...],
'Pradosha_Kaal' => [...],
'Bhadra' => [...],
'Dharma_Sindhu' => [...],
'Festivals' => [...],
'Daily_Observances' => [...],
'Special_Yogas' => [...],
'Anandadi_Yoga' => [...],
'Amritadi_Yoga' => [...],
'Panchak' => [...],
'Maitreya_Yoga' => [...],
'Gajachchhaya_Yoga' => [...],
'Nakshatra_Shool' => [...],
'Disha_Shool' => [...],
'Rahu_Vaasa' => [...],
'Chandra_Vaasa' => [...],
'Shiva_Vaasa' => [...],
'Agni_Vaasa' => [...],
'Yogini_Vaasa' => [...],
'Ekadashi_Observance' => [...],
'Transitions' => [...],
'Resolution_Context' => [...],
]
getFestivalSnapshot() Return Structure
[
'Festivals' => [
[
'name' => 'Holika Dahan',
'description' => 'Holika bonfire ritual',
'deity' => 'Vishnu/Prahlada',
'fasting' => false,
'regions' => ['Pan-India'],
'aliases' => [],
'observance_note' => null,
'calculation_basis' => [
'type' => 'tithi',
'type_name' => 'tithi',
'basis' => 'tithi',
'basis_name' => 'tithi',
'tithi' => [...],
'paksha' => 'Shukla',
'paksha_name' => 'Shukla',
'month' => [
'calendar_type' => 'amanta',
'value' => 'Phalguna',
'name' => 'Phalguna',
],
'karmakala_type' => 'pradosha',
'karmakala_type_name' => 'pradosha',
],
'resolution' => [...],
'rules_applied' => [...],
],
],
'Tithi' => [...],
'Vara' => [...],
'Nakshatra' => [...],
'Yoga' => [...],
'Karana' => [...],
'Sunrise' => '06:14:00 AM',
'Sunset' => '06:52:00 PM',
'Moonrise' => '10:12:35 PM',
'Moonset' => '09:00:37 AM',
'Moonrise_Date' => '2026-04-05',
'Moonset_Date' => '2026-04-06',
'Moonrise_ISO' => '05/04/2026 10:12:35 PM',
'Moonset_ISO' => '06/04/2026 09:00:37 AM',
'Moonset_Day_Relation' => 'next_day',
'Special_Yogas' => [...],
'Anandadi_Yoga' => [...],
'Amritadi_Yoga' => [...],
'Panchak' => [...],
'Maitreya_Yoga' => [...],
'Gajachchhaya_Yoga' => [...],
'Nakshatra_Shool' => [...],
'Disha_Shool' => [...],
'Rahu_Vaasa' => [...],
'Chandra_Vaasa' => [...],
'Shiva_Vaasa' => [...],
'Agni_Vaasa' => [...],
'Yogini_Vaasa' => [...],
'Ekadashi_Observance' => [...],
'Resolution_Context' => [...],
]
Festival metadata keeps canonical values for code and localized companion fields for display. The
calculation_basis.month block follows the active calendar_type only; it does not
emit both amanta and purnimanta months in the same localized output.
getMonthCalendar() Return Structure
[
'2026-04-01' => [
'date' => '2026-04-01',
'day' => 1,
'tithi' => [...],
'nakshatra' => [...],
'yoga' => [...],
'karana' => [...],
'vara' => [...],
'sun_sign' => [...],
'moon_sign' => [...],
'sunrise' => '06:43:00 AM',
'sunset' => '07:11:00 PM',
'moonrise' => '...',
'moonset' => '...',
'moonrise_date' => '2026-04-01',
'moonset_date' => '2026-04-02',
'moonrise_iso' => '01/04/2026 06:26:00 PM',
'moonset_iso' => '02/04/2026 06:05:00 AM',
'moonset_day_relation' => 'next_day',
'moon_visibility' => [
'starts_at' => '...',
'starts_on' => '2026-04-01',
'starts_iso' => '...',
'ends_at' => '...',
'ends_on' => '2026-04-02',
'ends_iso' => '...',
'ends_day_relation' => 'next_day',
],
'hindu_calendar' => [...],
'festivals' => [...],
'daily_observances' => [...],
'sankranti' => null,
],
]
Moon visibility note: month output preserves compact moonrise and moonset display fields, but also includes date-qualified fields because a moonset can occur after midnight on the next civil date.
Real-World Examples
Complete working examples for common use cases.
1. Daily Panchang Display
// Show today's panchang
$today = Panchang::getDayDetails(
date: CarbonImmutable::now(),
lat: $userLat,
lon: $userLon,
tz: $userTz
);
echo "Tithi: " . $today['Tithi']['name'];
echo "Nakshatra: " . $today['Nakshatra']['name'];
2. Festival Calendar
// Get festivals for entire month
$monthFestivals = [];
for ($day = 1; $day <= 31; $day++) {
$date = CarbonImmutable::create(2026, 10, $day);
$fest = Panchang::getFestivalSnapshot($date, $lat, $lon, $tz);
if (!empty($fest['Festivals'])) {
$monthFestivals[$day] = $fest['Festivals'];
}
}
3. Tradition-Specific Resolution
// Smarta-style date resolution (date-scoped festivals)
$smarta = Panchang::getDayDetails(
CarbonImmutable::parse('2026-09-06'),
28.61, 77.20, 'Asia/Kolkata'
)['Festivals'];
// Next-day festival context (for comparison)
$vaishnava = Panchang::getDayDetails(
CarbonImmutable::parse('2026-09-07'),
28.61, 77.20, 'Asia/Kolkata'
)['Festivals'];
4. Planetary Positions for a Timestamp
// Get planetary positions and ascendant for a timestamp/location
$timestampData = [
'year' => 1990, 'month' => 5, 'day' => 15,
'hour' => 14, 'minute' => 30, 'second' => 0,
'tz' => 'Asia/Kolkata', 'lat' => 28.61, 'lon' => 77.20
];
$planets = $astronomy->getPlanets($timestampData);
$ascendant = $astronomy->getAscendant($timestampData);
echo "Sun: " . $planets['Sun'] . "°\n";
echo "Ascendant: " . $ascendant . "°";
5. Comprehensive Full-Day Data
// Get all advanced time divisions for a date
$details = Panchang::getDayDetails($date, $lat, $lon, $tz);
$lagnas = $details['Lagna_Full_Day']; // Exact Sign entry times
$horas = $details['Hora_Full_Day']; // 24 planetary rulers
$praharas = $details['Prahara_Full_Day']; // 8 canonical periods
$muhurtas = $details['Muhurta_Full_Day']; // 30 named Muhurtas
$badTimes = $details['Rahu_Kaal_Gulika_Yamaganda']; // Rahu, Gulika, Yamaganda
$durs = $details['Dur_Muhurta_Full_Day']; // Inauspicious Muhurtas
$sandhya = $details['Sandhya']; // Pratah / Madhyahna / Sayahna
$gowri = $details['Gowri_Panchangam']; // Day + night Gowri divisions
$karmakala = $details['Karmakala_Windows']; // Named daily windows
6. Transit-Only Muhurta Evaluation
$evaluation = Panchang::getDailyMuhurtaEvaluation(
date: CarbonImmutable::now()->startOfDay(),
lat: $lat,
lon: $lon,
tz: $tz, currentAt: CarbonImmutable::now($tz)
);
$verdict = $evaluation['rejection_report']['overall_verdict'];
$bhadraActive = $evaluation['evaluation_results']['bhadra']['is_active'];
$varjyamActive = $evaluation['evaluation_results']['varjyam']['is_active'];
7. Raw JSON Exporter
Use this when you want the complete all-in-one package output in a single JSON file:
php scripts/panchang_raw_output.php > output.json
This writes meta, festivals_2026, eclipses_2026_2032,
todays_complete_details, and muhurta_evaluation in one file.
Additional standalone exporters are available in scripts/:
php scripts/panchang_today.php
php scripts/panchang_month_output.php 2026 4 > month_2026_04.json
php scripts/panchang_eclipses.php 2026 2032
php scripts/panchang_festivals.php 2026
panchang_today.php writes today_panchang.json automatically and also prints JSON
to stdout. panchang_month_output.php prints JSON to stdout only, so choose the filename with
shell redirection. panchang_eclipses.php writes eclipses_YYYY_YYYY.json
automatically and also prints JSON to stdout. panchang_festivals.php writes
festivals_YYYY.json automatically and prints status lines; do not redirect its stdout as raw
JSON.
Use PANCHANG_LOCALE=en|hi|gu and
PANCHANG_CALENDAR_TYPE=amanta|purnimanta to generate localized/calendar-type variants. For a
dedicated output directory, move implicit-output files after generation and redirect stdout-only scripts
directly:
cd scripts
dir="output/amanta/gu"
mkdir -p "$dir"
PANCHANG_CALENDAR_TYPE=amanta PANCHANG_LOCALE=gu php panchang_today.php > /tmp/today.log
mv -f today_panchang.json "$dir/today.json"
PANCHANG_CALENDAR_TYPE=amanta PANCHANG_LOCALE=gu php panchang_festivals.php 2026 > /tmp/festivals.log
mv -f festivals_2026.json "$dir/festivals_2026.json"
PANCHANG_CALENDAR_TYPE=amanta PANCHANG_LOCALE=gu php panchang_month_output.php 2026 4 > "$dir/month_2026_04.json"
PANCHANG_CALENDAR_TYPE=amanta PANCHANG_LOCALE=gu php panchang_eclipses.php 2026 2032 > /tmp/eclipses.log
mv -f eclipses_2026_2032.json "$dir/eclipses_2026_2032.json"
Accuracy & Date Range
Technical specifications of the Swiss Ephemeris astronomical engine.
Precision Modes
| Mode | Date Range | Precision |
|---|---|---|
| High Precision | 13,201 BCE to 17,191 CE | 0.001 arcsec |
| Standard | 3,000 BCE to 3,000 CE | 0.1 arcsec |
*High Precision requires
.se1 data files from Astro.com.
Ephemeris File Structure
Files are split into 600-year periods:
sepl_*.se1/semo_*.se1— Common Era (AD) Datesseplm*.se1/semom*.se1— Before Common Era (BC)se00*.se1— Asteroids (Range: 5401 BCE to 5399 CE)
Calculation Precision
- IEEE 754 — Double precision (53-bit significand)
- Lossless — No intermediate rounding in formulas
- High Convergence — 80 iterations for 1e-24 JD precision
Error Handling
Understanding and handling errors.
Common Exceptions
| Exception | When It Occurs | How to Handle |
|---|---|---|
RuntimeException |
Swiss Ephemeris file not found | Set correct ephe_path in config |
InvalidArgumentException |
Invalid latitude/longitude | Validate coordinates before calling |
RuntimeException |
Timezone not found | Use valid PHP timezone identifiers |
Best Practices
try {
$details = Panchang::getDayDetails(
date: $date,
lat: $lat, // Validate: -90 to 90
lon: $lon, // Validate: -180 to 180
tz: $tz // Validate: timezone_exists($tz)
);
} catch (RuntimeException $e) {
Log::error('Panchang calculation failed', [
'error' => $e->getMessage(),
'location' => compact('lat', 'lon', 'tz')
]);
return response()->json([
'error' => 'Unable to calculate panchang for this location'
], 500);
}
FAQ & Troubleshooting
Common questions and solutions.
⚠️ Why are my calculations different from other panchang apps?
- Answer
-
- Ayanamsa: Lahiri is fixed and cannot be changed in this package.
- Location: Ensure exact latitude/longitude.
- Tradition: Smarta vs Vaishnava have different rules.
- Precision Mode: Ensure you have
.se1ephemeris files installed for 0.001" accuracy. Without them, the engine falls back to the Moshier model (0.1" precision). - Panchang Day: Remember we use sunrise-to-sunrise days, not midnight-to-midnight.
⚠️ Why is the time wrong in my database/storage?
- Answer
-
Always use
_isofields for storage. Time-only fields lack date context:// WRONG - loses date context DB::table('events')->insert([ 'varjyam_start' => $details['Varjyam']['varjyam_start'] // "03:31 AM" ]); // CORRECT - includes full date DB::table('events')->insert([ 'varjyam_start' => $details['Varjyam']['varjyam_start_iso'] // "28/03/2026 03:31 AM" ]);
⚠️ Why does Varjyam show different times than expected?
- Answer
-
Varjyam can occur 0, 1, or 2 times per day. Always check
window_count:// Check how many windows exist $count = $details['Varjyam']['window_count']; if ($count === 0) { // No Varjyam today } elseif ($count === 1) { // One window - use top-level keys $start = $details['Varjyam']['varjyam_start']; } else { // Two windows - iterate windows array foreach ($details['Varjyam']['windows'] as $window) { // Process each window } }
⚠️ Why is the Hindu month different from other calendars?
- Answer
-
We use exact amavasya-to-amavasya solar transit logic, not simple longitude heuristics:
- Month is determined by which solar transit occurs between two amavasyas
- Adhika Masa (extra month) occurs when two amavasyas happen without a solar transit
- Kshaya Masa (lost month) occurs when no amavasya occurs in a solar month (very rare)
This is more accurate than simpler methods but can differ from other packages.
Can I change the ayanamsa?
- Answer
- No. This package is Lahiri-only by design for Panchang correctness.
Why is Janmashtami on different dates?
- Answer
-
This is normal. Smarta tradition celebrates on one day (ashtami at sunrise), Vaishnava on another (ashtami + Rohini nakshatra at midnight). Use the configured festival tradition profile or compare adjacent-day festival outputs.
How accurate are the calculations?
- Answer
-
We use Swiss Ephemeris which provides accuracy to within 1 arcsecond for planetary positions. All calculations use IEEE 754 double precision with no intermediate rounding.
Can I use this for historical dates?
- Answer
-
Yes! Swiss Ephemeris supports dates from 3000 BCE to 3000 CE. Just pass any valid CarbonImmutable date.
How do I handle multiple traditions?
- Answer
-
Calculate for both traditions and compare:
$smarta = $panchang->getDayDetails($date, $lat, $lon, $tz, elevation: 0.0, options: ['tradition' => 'Smarta']); $vaishnava = $panchang->getDayDetails($date, $lat, $lon, $tz, elevation: 0.0, options: ['tradition' => 'Vaishnava']); // Compare festivals $smartaFestivals = $smarta['Festivals']; $vaishnavaFestivals = $vaishnava['Festivals'];
Breaking Changes in v4.0.0
Important changes when upgrading from v3.x to v4.0.0.
Upgrade Notes
This is a major release with several breaking changes. Please review the changes below before upgrading.
1. Default Configuration Changes
| Setting | v3.x Default | v4.0.0 Default |
|---|---|---|
defaults.locale |
'hi' (Hindi) |
'en' (English) |
defaults.calendar_type |
'purnimanta' |
'amanta' |
2. Method Signature Changes
All enum getName() methods now accept an optional $locale parameter:
// v3.x
$name = Nakshatra::Ashwini->getName(); // "Ashwini"
// v4.0.0
$name = Nakshatra::Ashwini->getName(); // Uses configured locale
$name = Nakshatra::Ashwini->getName('hi'); // "अश्विनी"
$name = Nakshatra::Ashwini->getName('gu'); // "અશ્વિની"
3. Time Field Structure Changes
Sunrise, Sunset, Moonrise, and Moonset in the Panchanga output now return objects instead of strings:
// v3.x (string)
$details['Panchanga']['Sunrise']; // "06:14:00 AM"
// v4.0.0 (object)
$details['Panchanga']['Sunrise']; // ['jd' => 2461234.5, 'iso' => '2026-04-16T06:14:00+05:30', 'display' => '06:14:00 AM', 'timestamp' => 1234567890]
$details['Panchanga']['Sunrise']['display']; // "06:14:00 AM"
$details['Panchanga']['Sunrise']['jd']; // Julian Day
$details['Panchanga']['Sunrise']['iso']; // ISO timestamp
$details['Panchanga']['Sunrise']['timestamp']; // Unix timestamp
4. Enum Value Changes
| Enum | Change |
|---|---|
Paksha |
Values changed from string ('Shukla', 'Krishna') to int (0, 1) |
Karana |
Index values changed from 1-11 to 0-10. Fixed typo: Kimstughna → Kintughna |
Muhurta |
Expanded from 15 to 30 cases (15 day + 15 night muhurtas) |
Yoga |
Fixed typo: Vishkambha → Vishkumbh, Aindra → Indra |
5. Removed Methods
The following methods have been removed:
Masa::getEnglishApproximation()- removedMasa::getRulingNakshatra()- removedRitu::getEnglishName()- removedRitu::getMonths()- removedKarana::getType()- removedKarana::isVishti()- removed
6. PHP 8.3+ Requirement
This package targets PHP 8.3+ and the current Composer platform config is pinned accordingly.
7. Calendar Type Parameter
Methods like getDayDetails() support an optional calendarType parameter. If omitted, the default remains CalendarType::Amanta:
// v3.x
$details = $panchang->getDayDetails($date, $lat, $lon, $tz);
// Explicit enum
$details = $panchang->getDayDetails($date, $lat, $lon, $tz, 0.0, null, CalendarType::Amanta);
// Or use string
$details = $panchang->getDayDetails($date, $lat, $lon, $tz, 0.0, null, 'amanta');
$details = $panchang->getDayDetails($date, $lat, $lon, $tz, 0.0, null, 'purnimanta');
License
AGPL-3.0 License
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).
The core engine utilize the Swiss Ephemeris for precision calculations, which follows a dual-licensing model:
- Open Source: Licensed under GNU AGPLv3. If you use this package in a free/open-source project, your project must also be licensed under AGPLv3.
- Commercial: If you wish to use this package in a closed-source or commercial application, you MUST purchase a commercial license from Astrodienst AG.
For more details, see the full license text.
Complete Public API Surface (Live from src)
This section is a direct reflection snapshot of all public methods and public constants currently declared in src/.
Use this as the definitive signature reference when integrating the package.
## JayeshMepani\PanchangCore\Astronomy\AstronomyService
- __construct(SwissEph\FFI\SwissEphFFI $sweph): void
- configure(string $ephePath = ""): void
- getAscendant(array $birth): float
- getAyanamsa(float $jd): float
- getPlanetaryStates(array $birth, string $nodeMode = "mean", float $stationTolerance = 1.0E-6): array
- getPlanets(array $birth): array
- setAyanamsa(float $jd): void
- toJulianDayUtc(array $birth): float
## JayeshMepani\PanchangCore\Astronomy\EclipseService
- __construct(SwissEph\FFI\SwissEphFFI $sweph): void
- configure(string $ephePath = ""): void
- getEclipsesForYear(int $year, float $lat, float $lon, string $tz): array
## JayeshMepani\PanchangCore\Astronomy\SunService
- __construct(SwissEph\FFI\SwissEphFFI $sweph): void
- configure(string $ephePath = ""): void
- getBirthDatetime(array $birth): Carbon\CarbonImmutable
- getIntervalAndStart(array $birth): array
- getMoonriseMoonset(array $birth): array
- getSolarTransits(array $birth): array
- getSunriseSunset(array $birth): array
- getTwilightTimes(array $birth): array
- isDayBirth(array $birth): bool
- jdToCarbonPublic(float $jd, string $timezone): Carbon\CarbonImmutable
## JayeshMepani\PanchangCore\Core\AstroCore
- countSigns(int $targetSign, int $startSign, bool $forward = true): int
- formatAngle(float $angle): string|float
- formatCoordinate(float $coordinate): string|float
- formatDateTime(Carbon\CarbonImmutable $time): string
- formatDuration(float $minutes): string|float
- formatTime(Carbon\CarbonImmutable $time): string
- getAngularDistance(float $a, float $b): float
- getConfig(string $key, mixed $default = null): mixed
- getHouseNumFromLagna(int $signIdx, int $ascSignIdx): int
- getSign(float $lon): int
- getSignLon(float $lon): float
- getTimeDiffMinutesPrecise(DateTimeInterface $target, DateTimeInterface $reference): float
- normalize(float $x): float
- toDms(float $deg): string
## JayeshMepani\PanchangCore\Core\Constants\ClassicalTimeConstants
const SECONDS_PER_DAY
const MINUTES_PER_DAY
const SECONDS_PER_HOUR
const MINUTES_PER_HOUR
const SECONDS_PER_MINUTE
const GHATIKA_IN_MINUTES
const GHATIKA_PER_DAY
const PALA_IN_SECONDS
const MUHURTA_IN_MINUTES
const MUHURTA_PER_DAY
const ARUNODAYA_MINUTES
const ARUNODAYA_PER_DAY
const PRADOSHA_MINUTES
const PRADOSHA_PER_DAY
const BRAHMA_MUHURTA_MINUTES
const BRAHMA_MUHURTA_OFFSET_MINUTES
const DEGREES_PER_SIGN
const DEGREES_PER_NAKSHATRA
const DEGREES_PER_TITHI
const TITHIS_PER_PAKSHA
const NAKSHATRAS_TOTAL
const SIGNS_TOTAL
const CIRCLE_DEGREES
const JD_EPSILON
const BINARY_SEARCH_ITERATIONS
const DEGREE_EPSILON
const JUPITER_CYCLE_YEARS
const KALI_ERA_OFFSET
const VIKRAMA_ERA_OFFSET
const SHAKA_ERA_OFFSET
const BHADRA_TITHIS
const EKADASHI_TITHI
const CHATURDASHI_TITHI
const PURNIMA_TITHI
const SCORE_TITHI_AT_KARMAKALA
const SCORE_TITHI_AT_SUNRISE
const SCORE_TITHI_DURING_DAY
const SCORE_TITHI_DURING_NIGHT
const SCORE_WEEKDAY_MATCH
const SCORE_NAKSHATRA_MATCH
const SCORE_VRIDDHI_FIRST_DAY
const SCORE_KSHAYA_PENALTY
## JayeshMepani\PanchangCore\Core\Enums\CalendarType
const Amanta
const Purnimanta
- cases(): array
- from(string|int $value): static
- getLocalizedName(string $locale = null): string
- isAmanta(): bool
- isPurnimanta(): bool
- tryFrom(string|int $value): static
## JayeshMepani\PanchangCore\Core\Enums\Choghadiya
const Udveg
const Chal
const Labh
const Amrit
const Kaal
const Shubh
const Rog
- cases(): array
- from(string|int $value): static
- fromTime(float $jdSunrise, float $jdSunset, float $jdCurrent, JayeshMepani\PanchangCore\Core\Enums\Vara $vara): self
- getDaySequence(JayeshMepani\PanchangCore\Core\Enums\Vara $vara): array
- getName(string $locale = null): string
- getNature(): string
- getNightSequence(JayeshMepani\PanchangCore\Core\Enums\Vara $vara): array
- isAuspicious(): bool
- tryFrom(string|int $value): static
## JayeshMepani\PanchangCore\Core\Enums\Hora
const Sun
const Venus
const Mercury
const Moon
const Saturn
const Jupiter
const Mars
- cases(): array
- from(string|int $value): static
- getName(string $locale = null): string
- getSequence(JayeshMepani\PanchangCore\Core\Enums\Vara $vara): array
- tryFrom(string|int $value): static
## JayeshMepani\PanchangCore\Core\Enums\Karana
const Bava
const Balava
const Kaulava
const Taitila
const Gara
const Vanija
const Vishti
const Shakuni
const Chatushpada
const Naga
const Kintughna
- cases(): array
- from(string|int $value): static
- fromTithi(int $tithiIndex, float $fraction): self
- getFromLongitudes(float $sunLon, float $moonLon): array
- getName(string $locale = null): string
- tryFrom(string|int $value): static
## JayeshMepani\PanchangCore\Core\Enums\Masa
const Chaitra
const Vaishakha
const Jyeshtha
const Ashadha
const Shravana
const Bhadrapada
const Ashvina
const Kartika
const Margashirsha
const Pausha
const Magha
const Phalguna
- cases(): array
- from(string|int $value): static
- fromAmantaIndex(int $index): self
- fromIndex(int $index): self
- fromSunLongitude(float $sunLon): self
- getName(string $locale = null): string
- tryFrom(string|int $value): static
## JayeshMepani\PanchangCore\Core\Enums\Muhurta
const Rudra
const Sarpa
const Mitra
const Pitri
const Vasu
const Vara
const Vishvedeva
const Vidhi
const Brahma
const Indra
const Indragni
const Daitya
const Varuna
const Aryaman
const Bhaga
const Ishvara
const Ajapada
const Ahirbudhnya
const Pushya
const Nasatya
const Yama
const Vahni
const Dhala
const Shashi
const Aditya
const Guru
const Acyuta
const Arka
const Tvashta
const Vayu
- cases(): array
- from(string|int $value): static
- getDaySequence(): array
- getName(string $locale = null): string
- getNightSequence(): array
- tryFrom(string|int $value): static
## JayeshMepani\PanchangCore\Core\Enums\Nakshatra
const Ashwini
const Bharani
const Krittika
const Rohini
const Mrigashira
const Ardra
const Punarvasu
const Pushya
const Ashlesha
const Magha
const PurvaPhalguni
const UttaraPhalguni
const Hasta
const Chitra
const Swati
const Vishakha
const Anuradha
const Jyeshtha
const Mula
const PurvaAshadha
const UttaraAshadha
const Shravana
const Dhanishta
const Shatabhisha
const PurvaBhadrapada
const UttaraBhadrapada
const Revati
- cases(): array
- from(string|int $value): static
- fromLongitude(float $longitude): self
- getDeity(): string
- getLongitudeRange(): array
- getName(string $locale = null): string
- getPada(float $longitude): int
- getRulingPlanet(): string
- getSymbol(): string
- tryFrom(string|int $value): static
## JayeshMepani\PanchangCore\Core\Enums\Paksha
const Shukla
const Krishna
- cases(): array
- containsTithi(int $tithiIndex): bool
- from(string|int $value): static
- getDescription(): string
- getName(string $locale = null): string
- getRawName(): string
- getTithiRange(): array
- isKrishna(): bool
- isShukla(): bool
- normalizeTithi(int $tithiIndex): int
- opposite(): self
- toAbsoluteTithi(int $normalizedTithi): int
- tryFrom(string|int $value): static
## JayeshMepani\PanchangCore\Core\Enums\Rasi
const Mesha
const Vrishabha
const Mithuna
const Karka
const Simha
const Kanya
const Tula
const Vrischika
const Dhanu
const Makara
const Kumbha
const Meena
- cases(): array
- from(string|int $value): static
- fromLongitude(float $longitude): self
- getElement(): string
- getEnglishName(): string
- getLongitudeRange(): array
- getName(string $locale = null): string
- getRulingPlanet(): string
- getSymbol(): string
- tryFrom(string|int $value): static
## JayeshMepani\PanchangCore\Core\Enums\Ritu
const Vasanta
const Grishma
const Varsha
const Sharad
const Hemanta
const Shishira
- cases(): array
- from(string|int $value): static
- fromMonth(int $monthIndex): self
- fromSunLongitude(float $sunLon): self
- getName(string $locale = null): string
- tryFrom(string|int $value): static
## JayeshMepani\PanchangCore\Core\Enums\Samvatsara
const Prabhava
const Vibhava
const Shukla
const Pramoda
const Prajapati
const Angirasa
const Srimukha
const Bhava
const Yuva
const Dhata
const Ishvara
const Bahudhanya
const Pramathi
const Vikrama
const Vrisha
const Chitrabhanu
const Svabhanu
const Tarana
const Parthiva
const Vyaya
const Sarvajit
const Sarvadhari
const Virodhi
const Vikriti
const Khara
const Nandana
const Vijaya
const Jaya
const Manmatha
const Durmukhi
const Hevilambi
const Vilambi
const Vikari
const Sharvari
const Plava
const Shubhakritu
const Shobhakritu
const Krodhi
const Vishvavasu
const Parabhava
const Plavanga
const Kilaka
const Saumya
const Sadharana
const Virodhikritu
const Paritapi
const Pramadi
const Ananda
const Rakshasa
const Nala
const Pingala
const Kalayukti
const Siddharthi
const Raudri
const Durmati
const Dundubhi
const Rudhirodgari
const Raktakshi
const Krodhana
const Akshaya
- cases(): array
- from(string|int $value): static
- fromGregorianYear(int $gregorianYear): self
- fromYear(int $year): self
- getName(string $locale = null): string
- tryFrom(string|int $value): static
## JayeshMepani\PanchangCore\Core\Enums\Tithi
const ShuklaPratipada
const ShuklaDwitiya
const ShuklaTritiya
const ShuklaChaturthi
const ShuklaPanchami
const ShuklaShashthi
const ShuklaSaptami
const ShuklaAshtami
const ShuklaNavami
const ShuklaDashami
const ShuklaEkadashi
const ShuklaDwadashi
const ShuklaTrayodashi
const ShuklaChaturdashi
const Purnima
const KrishnaPratipada
const KrishnaDwitiya
const KrishnaTritiya
const KrishnaChaturthi
const KrishnaPanchami
const KrishnaShashthi
const KrishnaSaptami
const KrishnaAshtami
const KrishnaNavami
const KrishnaDashami
const KrishnaEkadashi
const KrishnaDwadashi
const KrishnaTrayodashi
const KrishnaChaturdashi
const Amavasya
- cases(): array
- from(string|int $value): static
- fromLongitudes(float $sunLon, float $moonLon): self
- getFractionRemaining(float $sunLon, float $moonLon): float
- getName(string $locale = null): string
- getNormalizedIndex(): int
- getPaksha(): JayeshMepani\PanchangCore\Core\Enums\Paksha
- isChaturdashi(): bool
- isEkadashi(): bool
- isPurnimaOrAmavasya(): bool
- tryFrom(string|int $value): static
## JayeshMepani\PanchangCore\Core\Enums\Vara
const Sunday
const Monday
const Tuesday
const Wednesday
const Thursday
const Friday
const Saturday
- cases(): array
- from(string|int $value): static
- fromDayOfWeek(int $dayOfWeek): self
- fromJulianDay(float $jd): self
- getEnglishName(): string
- getName(string $locale = null): string
- getRulingPlanet(): string
- tryFrom(string|int $value): static
## JayeshMepani\PanchangCore\Core\Enums\VimshottariDasha
const Sun
const Moon
const Mars
const Rahu
const Jupiter
const Saturn
const Mercury
const Ketu
const Venus
- cases(): array
- from(string|int $value): static
- fromNakshatra(JayeshMepani\PanchangCore\Core\Enums\Nakshatra $nakshatra): self
- getDashaYears(): int
- getName(string $locale = null): string
- tryFrom(string|int $value): static
## JayeshMepani\PanchangCore\Core\Enums\Yoga
const Vishkumbha
const Priti
const Ayushman
const Saubhagya
const Shobhana
const Atiganda
const Sukarma
const Dhriti
const Shula
const Ganda
const Vriddhi
const Dhruva
const Vyaghata
const Harshana
const Vajra
const Siddhi
const Vyatipata
const Variyana
const Parigha
const Shiva
const Siddha
const Sadhya
const Shubha
const Shukla
const Brahma
const Indra
const Vaidhriti
- cases(): array
- from(string|int $value): static
- fromLongitudes(float $sunLon, float $moonLon): self
- getFractionRemaining(float $sunLon, float $moonLon): float
- getName(string $locale = null): string
- tryFrom(string|int $value): static
## JayeshMepani\PanchangCore\Core\Localization
- translate(string $type, string|int $key, string $locale = null): string
## JayeshMepani\PanchangCore\Facades\Panchang
## JayeshMepani\PanchangCore\Festivals\FestivalFamilyOrchestrator
const FESTIVAL_FAMILIES
const EXCEPTION_LOGIC
- resolveFestivalFamily(string $familyName, array $baseDate, array $panchangData, string $tradition = null, string $region = null): array
## JayeshMepani\PanchangCore\Festivals\FestivalRuleEngine
- annotateMonthAnomalies(array $dateToDetails): array
- resolveMajorFestival(string $festivalName, array $rule, Carbon\CarbonImmutable $date, array $today, array $tomorrow): array
- resolveNakshatraBasedFestival(string $festivalName, array $rule, Carbon\CarbonImmutable $date, array $today, array $tomorrow): array
## JayeshMepani\PanchangCore\Festivals\FestivalService
const TITHI_VRATAS
const FESTIVALS
const MONTHS
- __construct(JayeshMepani\PanchangCore\Festivals\FestivalRuleEngine $ruleEngine): void
- buildFestivalPayload(string $name, array $rules, array $resolved = null): array
- getDailyObservances(array $panchangDetails): array
- getFestivalsForYear(int $year, string $pakshaSystem = "Amanta"): array
- resolveFestivalsForDate(Carbon\CarbonImmutable $date, array $todayDetails, array $tomorrowDetails, array $yesterdayDetails = null, callable $fetchHistoricalSnapshot = null, bool $includeExtraWinners = false): array
- usesClassicalResolver(array $rules): bool
## JayeshMepani\PanchangCore\Festivals\Utils\BhadraEngine
- calculateBhadra(float $sunriseJd, float $vishtiStartJd, float $vishtiEndJd, int $moonRasiIndex, int $tithiIndex, string $paksha): array
## JayeshMepani\PanchangCore\PanchangServiceProvider
- boot(): void
- register(): void
## JayeshMepani\PanchangCore\Panchanga\ElectionalEvaluator
- calculateAbhijitCancellation(float $sunrise, float $sunset, int $varaNumber, float $currentTime): array
- calculateAmritaKaal(int $varaNumber, float $sunrise, float $sunset, float $nextSunrise, float $currentTime): array
- calculateBhadra(int $moonSignIdx): array
- calculateDagdhaTithi(int $tithiNumber, int $moonSignIdx): array
- calculateDagdhaYoga(int $varaNumber, int $tithiNumber): array
- calculatePanchakaDosha(int $tithiNumber, int $varaNumber, int $nakshatraNumber, int $lagnaNumber): array
- calculateRiktaTithi(int $tithiNumber, bool $isKrishnaPaksha): array
- calculateTransitMoorthy(string $nakshatraName): array
- calculateVarjyam(int $nakshatraNumber, float $nakshatraStartTime, float $nakshatraDurationMinutes): array
- generateRejectionReport(array $evaluationResults): array
## JayeshMepani\PanchangCore\Panchanga\ElectionalRuleBook
const UNIVERSAL_BAD_TITHIS
const UNIVERSAL_BAD_CHOGADIYA
const UNIVERSAL_GOOD_CHOGADIYA
const UNIVERSAL_GOOD_HORAS
const UNIVERSAL_BAD_YOGAS
const UNIVERSAL_GOOD_KARANAS
const UNIVERSAL_BAD_KARANAS
const COMBUSTION_ORBS
const COMBUSTION_ORBS_RETRO
const VARA_TITHI_YOGAS
## JayeshMepani\PanchangCore\Panchanga\KalaNirnayaEngine
const GHATI_IN_MINUTES
const PALA_IN_SECONDS
const GHATIKA_PER_DAY
const ARUNODAYA_GHATIKAS
const ARUNODAYA_MINUTES
const SANKRANTI_PUNYA_KAAL
const TITHI_NAMES
const FESTIVAL_RULES
- __construct(float $latitude, float $longitude): void
- calculatePunyaKaal(string $sankrantiName, float $sankrantiJd, float $sunriseJd, float $sunsetJd): array
- configure(string $ephePath = ""): void
- determineEkadashi(float $ekadashiStartJd, float $ekadashiEndJd, float $dashamiEndJd, float $dvadashiStartJd, float $sunriseJd, float $nextSunriseJd, string $tradition = "Vaishnava"): array
- determineViddhaTithi(int $tithiNumber, float $tithiStartJd, float $tithiEndJd, float $sunriseDay1Jd, float $sunriseDay2Jd, float $prevTithiEndJd): array
- generateKalaNirnayaReport(int $tithiNumber, float $tithiStartJd, float $tithiEndJd, float $prevTithiEndJd, float $sunriseJd, float $sunsetJd, float $nextSunriseJd): array
- resolveFestivalDate(string $festivalName, float $tithiStartJd, float $tithiEndJd, float $sunriseJd, float $sunsetJd, float $nextSunriseJd): array
## JayeshMepani\PanchangCore\Panchanga\MuhurtaService
- __construct(JayeshMepani\PanchangCore\Muhurta\Planetary\HoraCalculator $horaCalculator, JayeshMepani\PanchangCore\Muhurta\Planetary\ChogadiyaCalculator $chogadiyaCalculator, JayeshMepani\PanchangCore\Muhurta\Classical\DailyPeriodsCalculator $dailyPeriodsCalculator, JayeshMepani\PanchangCore\Muhurta\Classical\InauspiciousPeriodsCalculator $inauspiciousPeriodsCalculator, JayeshMepani\PanchangCore\Muhurta\Regional\GowriPanchangamCalculator $gowriPanchangamCalculator, JayeshMepani\PanchangCore\Muhurta\Lagna\LagnaTableCalculator $lagnaTableCalculator): void
- calculateAbhijitMuhurta(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset): array
- calculateAmritaKaal(Carbon\CarbonImmutable $sunrise, array $varjyam): array
- calculateBadTimes(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, int $varaIdx): array
- calculateBrahmaMuhurta(Carbon\CarbonImmutable $sunrise): array
- calculateChogadiya(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, Carbon\CarbonImmutable $current, int $varaIdx): array
- calculateChogadiyaTable(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, int $varaIdx): array
- calculateDaylightFivefoldDivision(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset): array
- calculateDurMuhurta(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, int $varaIdx): array
- calculateGodhuliMuhurta(Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise): array
- calculateGowriPanchangam(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, int $varaIdx): array
- calculateHora(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, Carbon\CarbonImmutable $current, int $varaIdx): array
- calculateHoraTable(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, int $varaIdx): array
- calculateKalaVela(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, int $varaIdx): array
- calculateLagna(Carbon\CarbonImmutable $current, Carbon\CarbonImmutable $sunrise, float $sunriseSunLongitude, float $ayanamsaDeg, float $lat, float $lon, SwissEph\FFI\SwissEphFFI $sweph): array
- calculateLagnaTable(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, float $sunriseSunLongitude, float $ayanamsaDeg, float $lat, float $lon, SwissEph\FFI\SwissEphFFI $sweph): array
- calculateMuhurtaTable(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise): array
- calculateNishitaMuhurta(Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise): array
- calculatePradoshaKaal(Carbon\CarbonImmutable $sunset, int $tithiNum): array
- calculatePrahara(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise): array
- calculateSandhya(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, Carbon\CarbonImmutable $solarNoon): array
- calculateVarjyam(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset, Carbon\CarbonImmutable $nextSunrise, int $nakshatraIndex, float $nakshatraStartJd, float $nakshatraEndJd): array
- calculateVijayaMuhurta(Carbon\CarbonImmutable $sunrise, Carbon\CarbonImmutable $sunset): array
## JayeshMepani\PanchangCore\Panchanga\OutputGeneratorService
- __construct(JayeshMepani\PanchangCore\Panchanga\PanchangService $panchangService, JayeshMepani\PanchangCore\Astronomy\EclipseService $eclipseService): void
- generateAll(int $festivalYear, int $eclipseStartYear, int $eclipseEndYear, float $lat, float $lon, string $tz, float $elevation = 0, JayeshMepani\PanchangCore\Core\Enums\CalendarType|string $calendarType = JayeshMepani\PanchangCore\Core\Enums\CalendarType::Amanta): array
- generateEclipses(int $startYear, int $endYear, float $lat, float $lon, string $tz): array
- generateFestivals(int $year, float $lat, float $lon, string $tz, float $elevation = 0, JayeshMepani\PanchangCore\Core\Enums\CalendarType|string $calendarType = JayeshMepani\PanchangCore\Core\Enums\CalendarType::Amanta): array
- generateTodayPanchang(float $lat, float $lon, string $tz, float $elevation = 0, JayeshMepani\PanchangCore\Core\Enums\CalendarType|string $calendarType = JayeshMepani\PanchangCore\Core\Enums\CalendarType::Amanta): array
## JayeshMepani\PanchangCore\Panchanga\PanchangService
- __construct(SwissEph\FFI\SwissEphFFI $sweph, JayeshMepani\PanchangCore\Astronomy\SunService $sunService, JayeshMepani\PanchangCore\Astronomy\AstronomyService $astronomy, JayeshMepani\PanchangCore\Panchanga\PanchangaEngine $panchanga, JayeshMepani\PanchangCore\Panchanga\MuhurtaService $muhurta, JayeshMepani\PanchangCore\Festivals\FestivalService $festivalService, JayeshMepani\PanchangCore\Festivals\Utils\BhadraEngine $bhadraEngine, mixed $unusedTransitEngine = null, mixed $unusedIntervalTracker = null, JayeshMepani\PanchangCore\Panchanga\Residences\VaasaCalculator|null $vaasaCalculator = null, JayeshMepani\PanchangCore\Panchanga\Residences\ShoolaCalculator|null $shoolaCalculator = null, JayeshMepani\PanchangCore\Panchanga\Yogas\SpecialYogaCalculator|null $specialYogaCalculator = null, JayeshMepani\PanchangCore\Panchanga\Doshas\PanchakCalculator|null $panchakCalculator = null, JayeshMepani\PanchangCore\Panchanga\Doshas\BhadraCalculator|null $bhadraCalculator = null, mixed $unusedVarjyamWindowCalculator = null, JayeshMepani\PanchangCore\Panchanga\Vrata\EkadashiParanaCalculator|null $ekadashiParanaCalculator = null, mixed ...$unusedExtractedCalculators): void
- configure(string $ephePath = ""): void
- getDailyMuhurtaEvaluation(Carbon\CarbonImmutable $date, float $lat, float $lon, string $tz, Carbon\CarbonImmutable $currentAt = null, float $elevation = 0, array $options = []): array
- getDayDetails(Carbon\CarbonImmutable $date, float $lat, float $lon, string $tz, float $elevation = 0, Carbon\CarbonImmutable $calculationAt = null, JayeshMepani\PanchangCore\Core\Enums\CalendarType|string $calendarType = JayeshMepani\PanchangCore\Core\Enums\CalendarType::Amanta, array $options = []): array
- getElectionalSnapshot(Carbon\CarbonImmutable $date, float $lat, float $lon, string $tz, float $elevation = 0, array $options = []): array
- getFestivalSnapshot(Carbon\CarbonImmutable $date, float $lat, float $lon, string $tz, float $elevation = 0, Carbon\CarbonImmutable $calculationAt = null, JayeshMepani\PanchangCore\Core\Enums\CalendarType|string $calendarType = JayeshMepani\PanchangCore\Core\Enums\CalendarType::Amanta): array
- getFestivalYearCalendar(int $year, float $lat, float $lon, string $tz, float $elevation = 0, Carbon\CarbonImmutable $calculationAt = null, JayeshMepani\PanchangCore\Core\Enums\CalendarType|string $calendarType = JayeshMepani\PanchangCore\Core\Enums\CalendarType::Amanta): array
- getMonthCalendar(int $year, int $month, float $lat, float $lon, string $tz, float $elevation = 0, array $options = [], Carbon\CarbonImmutable $calculationAt = null, JayeshMepani\PanchangCore\Core\Enums\CalendarType|string $calendarType = JayeshMepani\PanchangCore\Core\Enums\CalendarType::Amanta): array
## JayeshMepani\PanchangCore\Panchanga\PanchangaEngine
- calculateKundaLagna(float $ascLon): array
- calculatePanchakaRahita(int $tithiNum, int $varaNum, int $nakNum, int $lagnaNum): array
- calculateTithi(float $sunLon, float $moonLon): array
- calculateVara(array $birth, JayeshMepani\PanchangCore\Astronomy\SunService $sunService): array
- calculateYoga(float $sunLon, float $moonLon): array
- getAyana(float $sunLon): string
- getGujaratiSamvat(int $vikramSamvat, int $monthIndex): int
- getHinduMonth(float $sunLon, float $moonLon, string $paksha = "Shukla"): array
- getKaliSamvat(int $vikramSamvat): int
- getKarana(float $sunLon, float $moonLon): array
- getNakshatraInfo(float $longitude): array
- getPanchanga(float $sunLon, float $moonLon, array $birth, JayeshMepani\PanchangCore\Astronomy\SunService $sunService, JayeshMepani\PanchangCore\Astronomy\AstronomyService $astronomy): array
- getRitu(float $sunLon): string
- getSamvat(int $year, int $month): array
- getSamvatsara(int $vikramSamvat): string
- getSamvatsaraNorth(int $vikramSamvat): string
- isVishtiKarana(float $sunLon, float $moonLon): bool
## JayeshMepani\PanchangCore\Traits\CliBootstrap
- init(string $baseDir): void
- makeEclipseService(): JayeshMepani\PanchangCore\Astronomy\EclipseService
- makeOutputGenerator(JayeshMepani\PanchangCore\Panchanga\PanchangService $panchang): JayeshMepani\PanchangCore\Panchanga\OutputGeneratorService
- makePanchangService(): JayeshMepani\PanchangCore\Panchanga\PanchangService
Quick Reference
What to Use When
| I want to… | Use this method |
|---|---|
| Get complete panchanga for a day | PanchangService::getDayDetails() |
| Get only festivals | PanchangService::getFestivalSnapshot() |
| Build a month calendar grid | PanchangService::getMonthCalendar() |
| Get transit-only muhurta evaluation for now | PanchangService::getDailyMuhurtaEvaluation() |
| Get planetary positions | AstronomyService::getPlanets() |
| Get sunrise/sunset | SunService::getSunriseSunset() |
| Calculate Tithi manually | PanchangaEngine::calculateTithi() |
| Get Nakshatra from Moon position | PanchangaEngine::getNakshatraInfo() |
| Get Muhurta times | MuhurtaService::calculateMuhurtaTable() |
| Get auspicious times | MuhurtaService::calculateAbhijitMuhurta() |
| Get Brahma Muhurta | MuhurtaService::calculateBrahmaMuhurta() |
| Get named daily Karmakala windows | PanchangService::getDayDetails() → Karmakala_Windows |
| Get Gowri Panchangam | MuhurtaService::calculateGowriPanchangam() |
| Get Kala Vela | MuhurtaService::calculateKalaVela() |
| Get Rahu Kala, Gulika | MuhurtaService::calculateBadTimes() |
| Get resolved festivals for a date | PanchangService::getDayDetails() /
FestivalService::resolveFestivalsForDate() |
| Get season (Ritu) | PanchangaEngine::getRitu() |
| Get Samvatsara | PanchangaEngine::getSamvatsara() |
| Use Hindi or Gujarati output | Set defaults.locale or PANCHANG_LOCALE |
| Use Amanta or Purnimanta month names | Pass $calendarType or set PANCHANG_CALENDAR_TYPE |
Classical Text References
All calculations reference authentic Sanskrit texts and traditions. See docs/TRADITIONAL_TEXT_SOURCES.md for complete source-integrity map with confidence tiers.
- Sūrya Siddhānta 1.29→ Tithi (30 lunar days, 12° each)
- Sūrya Siddhānta 8.1→ Nakṣatra (27 lunar mansions, 13°20' each)
- Sūrya Siddhānta 3.1-3→ Yoga (27 combinations, 13°20' Sun-Moon sum)
- Muhūrta Chintāmaṇi Chapter 2→ Karana (11 half lunar days, 6° each)
- Muhūrta Chintāmaṇi→ Muhūrta, Aruṇodaya, Pradoṣa
- Bṛhat Saṃhitā→ Samvatsara, Ritu, Muhurta rules
- Nirṇaya Sindhu→ Festival timing, Bhadra rules
- Aṣṭāṅga Hṛdaya→ Brahma Muhūrta timing
- Hari Bhakti Vilāsa→ Vaishnava Ekadashi rules