nepali-date-library
Version:
A Nepali Date Library for both typescript and javascript
362 lines (280 loc) • 10.8 kB
Markdown
# NepaliDate Library
## Overview
The `NepaliDate` library provides a proper way to work with Nepali (Bikram Sambat) dates in TypeScript/JavaScript. It allows you to create, manipulate, format, and convert between Nepali and Gregorian dates with support for fiscal years, quarters, and extensive date operations.
## Installation
```sh
npm install nepali-date-library
```
## Importing the Library
```ts
import { NepaliDate, ADtoBS, BStoAD } from 'nepali-date-library';
```
## Class: `NepaliDate`
### Constructors
```ts
new NepaliDate();
new NepaliDate(date: Date | NepaliDate | number | string);
new NepaliDate(year: number, month: number, day: number);
```
- Creates a `NepaliDate` instance.
- Accepts either no arguments (current date), a JavaScript `Date`, another `NepaliDate`, a timestamp, or a formatted date string.
- Can also accept year, month (0-11), and day (1-32) as separate arguments.
### Date Conversion Functions
#### Pre-built Conversion Functions
```ts
import { ADtoBS, BStoAD } from 'nepali-date-library';
// Convert AD to BS
const bsDate = ADtoBS('2025-02-22'); // Returns: '2081-10-10'
// Convert BS to AD
const adDate = BStoAD('2081-10-14'); // Returns: '2025-02-26'
```
#### Class Method
```ts
const nepaliDate = new NepaliDate();
const adDate = nepaliDate.getEnglishDate(); // Returns JavaScript Date object
```
### Getters
```ts
getYear(): number; // Returns Nepali year
getMonth(): number; // Returns Nepali month (0-11)
getDate(): number; // Returns Nepali day (1-32)
getDay(): number; // Returns day of week (0-6, 0 = Sunday)
getHours(): number; // Returns hour (0-23)
getMinutes(): number; // Returns minutes (0-59)
getSeconds(): number; // Returns seconds (0-59)
getMilliseconds(): number; // Returns milliseconds (0-999)
getTime(): number; // Returns timestamp in milliseconds
```
### Setters
```ts
setYear(year: number): void;
setMonth(month: number): void;
setDate(day: number): void;
set(year: number, month: number, day: number): void;
```
- Updates the Nepali date components and synchronizes the internal timestamp.
### Parsing
```ts
parse(dateString: string): void;
```
- Parses a date string and updates the current instance
- Supports formats: YYYY-MM-DD, YYYY/MM/DD, or YYYY.MM.DD
### Formatting
```ts
format(formatStr: string): string;
toString(): string; // Returns format: YYYY/MM/DD (1-indexed month)
```
#### Available Format Tokens:
- **English Formats:**
- `YYYY` - Full Year (e.g., 2080)
- `MM` - Month with leading zero (01-12)
- `M` - Month without leading zero (1-12)
- `MMM` - Short month name (Bai, Cha)
- `MMMM` - Long month name (Baisakh, Chaitra)
- `DD` - Day with leading zero (01-32)
- `D` - Day without leading zero (1-32)
- `DDD` - Short day name (Sun, Sat)
- `DDDD` - Full day name (Sunday)
- **Nepali Formats:**
- `yyyy` - Full Year (e.g., २०८१)
- `mm` - Month with leading zero (०१-१२)
- `m` - Month without leading zero (१-१२)
- `mmm` - Short month name (बै, चै)
- `mmmm` - Long month name (बैशाख, चैत्र)
- `dd` - Day with leading zero (०१-३२)
- `d` - Day without leading zero (१-३२)
- `ddd` - Short day name (आइत, शनि)
- `dddd` - Full day name (आइतबार)
### Date Manipulation
```ts
addDays(days: number): NepaliDate;
addMonths(months: number): NepaliDate;
addYears(years: number): NepaliDate;
```
- Adds a specified number of days, months, or years to the date and returns a new `NepaliDate` instance.
### Date Information Methods
#### `daysInMonth(): number`
Returns the number of days in the current month.
#### `isLeapYear(): boolean`
Checks if the current year is a leap year in the Nepali calendar.
#### `getWeeksInMonth(): number`
Calculates the number of weeks in the current month.
### Date Comparison Methods
#### `diff(date: NepaliDate, unit: 'year' | 'month' | 'day'): number`
Calculates the difference between two `NepaliDate` instances.
#### `isAfter(date: NepaliDate): boolean`
Checks if this date comes after the specified date.
#### `isBefore(date: NepaliDate): boolean`
Checks if this date comes before the specified date.
#### `isEqual(date: NepaliDate): boolean`
Checks if this date is exactly equal to the specified date (year, month, day).
#### `isSame(date: NepaliDate, unit: 'year' | 'month' | 'day'): boolean`
Checks if this date is the same as the specified date for the given unit.
### Date Range Methods
#### `startOfDay(): NepaliDate`
Returns a new `NepaliDate` representing the start of the current day (00:00:00).
#### `endOfDay(): NepaliDate`
Returns a new `NepaliDate` representing the end of the current day (23:59:59.999).
#### `startOfWeek(startOfWeek: number = 0): NepaliDate`
Returns a new `NepaliDate` representing the start of the week containing this date.
- `startOfWeek`: Day to consider as start of week (0-6, where 0 = Sunday, 1 = Monday, etc.)
#### `endOfWeek(startOfWeek: number = 0): NepaliDate`
Returns a new `NepaliDate` representing the end of the week containing this date.
#### `startOfMonth(): NepaliDate`
Returns a new `NepaliDate` representing the first day of the current month.
#### `endOfMonth(): NepaliDate`
Returns a new `NepaliDate` representing the last day of the current month.
#### `startOfYear(): NepaliDate`
Returns a new `NepaliDate` representing the first day of the current Nepali year (1st Baisakh).
#### `endOfYear(): NepaliDate`
Returns a new `NepaliDate` representing the last day of the current Nepali year (last day of Chaitra).
### Quarter and Fiscal Year Methods
#### `getCurrentQuarter(): number`
Returns the quarter number (1-4) for the current date.
#### `getCurrentFiscalYearQuarter(): number`
Returns the current fiscal year quarter number (1-4) for the current date.
- Fiscal year starts from Shrawan 1st (month 3, day 1)
#### `getCurrentFiscalYearQuarterDates(): { start: NepaliDate; end: NepaliDate }`
Returns the start and end dates of the current fiscal year quarter.
### Static Methods
#### Date Range Utilities
```ts
static minimum(): Date; // Returns earliest supported date
static maximum(): Date; // Returns latest supported date
```
#### Validation
```ts
static isValid(year: number, month: number, day: number): boolean;
isValid(): boolean; // Instance method
```
#### Name Utilities
```ts
static getMonthName(month: number, short: boolean = false, nepali: boolean = false): string;
static getDayName(day: number, short: boolean = false, nepali: boolean = false): string;
```
#### Calendar Generation
```ts
static getCalendarDays(year: number, month: number): {
prevRemainingDays: number,
prevMonth: { year: number, month: number, days: number[] },
currentMonth: { year: number, month: number, days: number[] },
nextMonth: { year: number, month: number, days: number[] },
remainingDays: number
}
```
Generates calendar days for a given month, including trailing/leading days from adjacent months.
#### Quarter Methods
```ts
static getQuarter(quarter: number, year?: number): { start: NepaliDate; end: NepaliDate };
static getQuarters(year?: number): {
Q1: { start: NepaliDate; end: NepaliDate };
Q2: { start: NepaliDate; end: NepaliDate };
Q3: { start: NepaliDate; end: NepaliDate };
Q4: { start: NepaliDate; end: NepaliDate };
};
```
#### Fiscal Year Methods
```ts
static getCurrentFiscalYear(): number;
static getFiscalYearQuarter(quarter: number, fiscalYear?: number): { start: NepaliDate; end: NepaliDate };
static getFiscalYearQuarters(fiscalYear?: number): {
Q1: { start: NepaliDate; end: NepaliDate };
Q2: { start: NepaliDate; end: NepaliDate };
Q3: { start: NepaliDate; end: NepaliDate };
Q4: { start: NepaliDate; end: NepaliDate };
};
```
#### Utility Methods
```ts
clone(): NepaliDate; // Creates a copy of the current instance
```
## Example Usage
### Basic Usage
```ts
const today = new NepaliDate();
console.log(today.toString()); // 2081/10/15
const formatted = today.format('YYYY-MM-DD');
console.log(formatted); // 2081-10-15
const nepaliFormatted = today.format('yyyy-mm-dd');
console.log(nepaliFormatted); // २०८१-१०-१५
```
### Date Manipulation
```ts
const date = new NepaliDate(2081, 9, 15);
const futureDate = date.addDays(10);
const pastDate = date.addMonths(-2);
const nextYear = date.addYears(1);
```
### Date Comparison
```ts
const date1 = new NepaliDate(2081, 5, 10);
const date2 = new NepaliDate(2081, 5, 15);
console.log(date1.isBefore(date2)); // true
console.log(date1.diff(date2, 'day')); // -5
console.log(date1.isSame(date2, 'month')); // true
```
### Working with Quarters
```ts
// Get current quarter
const currentQuarter = new NepaliDate().getCurrentQuarter();
// Get fiscal year quarter
const fiscalQuarter = new NepaliDate().getCurrentFiscalYearQuarter();
// Get all quarters for a year
const quarters = NepaliDate.getQuarters(2081);
console.log(quarters.Q1); // { start: NepaliDate, end: NepaliDate }
// Get fiscal year quarters
const fiscalQuarters = NepaliDate.getFiscalYearQuarters(2081);
```
### Calendar Generation
```ts
const calendarData = NepaliDate.getCalendarDays(2081, 4);
console.log(calendarData.currentMonth.days); // [1, 2, 3, ..., 30]
console.log(calendarData.prevMonth.days); // Days from previous month
```
### Date Range Operations
```ts
const date = new NepaliDate(2081, 5, 15);
const startOfWeek = date.startOfWeek(); // Sunday of current week
const endOfWeek = date.endOfWeek(); // Saturday of current week
const startOfMonth = date.startOfMonth(); // 1st day of current month
const endOfYear = date.endOfYear(); // Last day of current year
```
### Validation
```ts
// Static validation
console.log(NepaliDate.isValid(2081, 4, 32)); // false (day out of range)
// Instance validation
const date = new NepaliDate(2081, 5, 10);
console.log(date.isValid()); // true
```
### Name Utilities
```ts
// Month names
console.log(NepaliDate.getMonthName(0, false, false)); // "Baisakh"
console.log(NepaliDate.getMonthName(0, true, true)); // "बै"
// Day names
console.log(NepaliDate.getDayName(0, false, true)); // "आइतबार"
console.log(NepaliDate.getDayName(1, true, false)); // "Mon"
```
## Error Handling
- Throws an error if an invalid date format is used in constructor or parse method
- Throws an error if the Nepali date is out of the supported range
- Validates input parameters and throws appropriate errors for invalid values
## Supported Date Range
The library supports Nepali dates within a specific range. Use `NepaliDate.minimum()` and `NepaliDate.maximum()` to get the supported date boundaries.
## Acknowledgements
This project was inspired by [nepali-date](https://github.com/sharingapples/nepali-date).
## License
MIT License