react-native-jalali-persian-date-picker
Version:
React Native Jalali Date Picker Component
96 lines (79 loc) • 3.22 kB
text/typescript
import { PERSIAN_DIGITS } from './constant';
import { jalaaliMonthLength, toGregorian, toJalaali } from 'jalaali-js';
/**
* convert jalali to gregorian date
* @param {string} date
* @param {string} dateSeparator
*/
const j2g = (date: string, dateSeparator: string) => {
const split: string[] = date.split(dateSeparator);
const year = parseInt(split[0] as string);
const month = parseInt(split[1] as string);
const day = parseInt(split[2] as string);
const { gy, gm, gd } = toGregorian(year, month, day);
return new Date(gy, gm - 1, gd);
};
export const isBefore = (firstDate: string, secondDate: string, dateSeparator: string) =>
j2g(firstDate, dateSeparator) < j2g(secondDate, dateSeparator);
export const isAfter = (firstDate: string, secondDate: string, dateSeparator: string) =>
j2g(firstDate, dateSeparator) > j2g(secondDate, dateSeparator);
/**
* convert gregorian to jalali date
* @param {string} date
* @param {string} dateSeparator
*/
const g2j = (date: string, dateSeparator: string = '-') => {
const split: string[] = date.split(dateSeparator);
const year: number = parseInt(split[0] as string);
const month: number = parseInt(split[1] as string);
const day: number = parseInt(split[2] as string);
const { jy, jm, jd } = toJalaali(year, month, day);
return fullDate(jy, jm, jd, '/');
};
export const today = () => {
const currentDate = new Date().toISOString().slice(0, 10);
return g2j(currentDate);
};
export const lastYear = () => {
const currentDate: string = new Date().toISOString().slice(0, 10);
const split: string[] = currentDate.split('-');
const year: number = parseInt(split[0] as string) - 1;
const month = split[1];
const day = split[2];
return g2j(`${year}-${month}-${day}`);
};
export const nextYear = () => {
const currentDate = new Date().toISOString().slice(0, 10);
const split = currentDate.split('-');
const year = parseInt(split[0] as string) + 1;
const month = split[1];
const day = split[2];
return g2j(`${year}-${month}-${day}`);
};
export const getTimeHours = (): string[] =>
Array.from({ length: 24 }, (_x, i) => i < 10 ? '0' + i : String(i));
export const getTimeMinutes = (): string[] =>
Array.from({ length: 60 / 5 }, (_x, i) => i * 5 < 10 ? '0' + (i * 5) : String(i * 5));
export const getDays = (year: number, month: number) => {
const daysLength = jalaaliMonthLength(year, month);
const { gy, gm, gd } = toGregorian(year, month, 1);
const firstDayIndex = new Date(gy, gm - 1, gd).getDay();
const startingEmptyDays = (firstDayIndex + 1) % 7;
return [
...Array(startingEmptyDays).fill('.'),
...Array.from({ length: daysLength }, (_, i) => i + 1),
];
};
export const getYears = (min: number, max: number) => {
const length = max - min + 1;
return Array.from({ length }, (_, i) => min + i);
};
export const fullDate = (year: number, month: number, day: number | string, dateSeparator: string): string =>
`${year}${dateSeparator}${month < 10 ? '0' + month : month}${dateSeparator}${
parseInt(day as string) < 10 ? '0' + day : day
}`;
export const toPersian = (num: string) =>
`${num}`
.split('')
.map((digit) => PERSIAN_DIGITS[Number(digit)])
.join('');