import jalaali from 'jalaali-js' import dayjs from 'dayjs' import utc from 'dayjs/plugin/utc' import timezone from 'dayjs/plugin/timezone' dayjs.extend(utc) dayjs.extend(timezone) export const convertToDateString = (dateString: string): string => { const date = dayjs(dateString) if (date.year() === 1 || Number.isNaN(date.year())) return 'نا مشخص' const jalaaliDate = jalaali.toJalaali(date.year(), date.month() + 1, date.date()) return `${jalaaliDate.jy}/${String(jalaaliDate.jm).padStart(2, '0')}/${String(jalaaliDate.jd).padStart(2, '0')}` } interface PersianDateValue { year: number month: number | { number: number } day: number hour?: number minute?: number second?: number } export const convertToISOFormat = (dateObject: PersianDateValue) => { const { year, month, day, hour, minute, second } = dateObject const monthNumber = typeof month === 'number' ? month : month.number const { gy, gm, gd } = jalaali.toGregorian(year, monthNumber, day) const date = dayjs(new Date(gy, gm - 1, gd, hour || 0, minute || 0, second || 0)) return date.format('YYYY-MM-DDTHH:mm:ss.SSSZ') } const calculateDuration = (durSeconds: number) => { let hour, minute, seconds seconds = Math.floor(durSeconds) minute = Math.floor(seconds / 60) seconds = seconds % 60 hour = Math.floor(minute / 60) minute = minute % 60 const day = Math.floor(hour / 24) hour = hour % 24 let duration = '' if (day) return 'بیش از یک روز' if (hour) { duration += `${hour} ساعت` if (minute) { duration += ' و ' duration += `${minute} دقیقه` } if (seconds) { duration += ' و ' duration += `${seconds} ثانیه` } return duration } if (minute) { duration += `${minute} دقیقه` if (seconds) { duration += ' و ' duration += `${seconds} ثانیه` } return duration } if (seconds) duration += `${seconds} ثانیه` return duration.length ? duration : '0 ثانیه' } type DateInput = string | number | Date | null | undefined export const getDate = (input: DateInput, outFormat: string | null = 'jYYYY/jMM/jDD', inFormat: string | null = 'YYYY-MM-DDTHH:mm:ssZ') => { const storageTimeZone = '+0330' const resolvedOutFormat = outFormat ?? 'jYYYY/jMM/jDD' const resolvedInFormat = inFormat ?? 'YYYY-MM-DDTHH:mm:ssZ' if ((input === null || input === undefined || input === '') && resolvedInFormat !== 'calculateDuration') return null const inputText = String(input) if (inputText.startsWith('-')) return 'Invalid Date' if (resolvedOutFormat === 'duration') { return dayjs.unix(Number(input)).diff(dayjs(), 'days') } if (resolvedInFormat === 'calculateDuration') { return calculateDuration(Number(input)) } if (resolvedOutFormat === 'HH:MM - jYYYY/jMM/jDD') { const date = dayjs(input).utcOffset(storageTimeZone) const jDate = jalaali.toJalaali(date.year(), date.month() + 1, date.date()) return `${date.format('HH:mm')} - ${jDate.jy}/${String(jDate.jm).padStart(2, '0')}/${String(jDate.jd).padStart(2, '0')}` } if (resolvedInFormat === 'timestamp' && resolvedOutFormat !== 'jalaliDay' && resolvedOutFormat !== 'jalaliMonth') { const date = dayjs.unix(Number(input)).utcOffset(storageTimeZone) const jDate = jalaali.toJalaali(date.year(), date.month() + 1, date.date()) return `${jDate.jy}/${String(jDate.jm).padStart(2, '0')}/${String(jDate.jd).padStart(2, '0')}` } if (resolvedInFormat === 'timestamp' && resolvedOutFormat === 'jalaliDay') { const weekDays = ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنج‌شنبه', 'جمعه', 'شنبه'] return weekDays[dayjs.unix(Number(input)).utcOffset(storageTimeZone).day()] } if (resolvedInFormat === 'timestamp' && resolvedOutFormat === 'jalaliMonth') { const jalaliMonths = ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'] const date = dayjs.unix(Number(input)).utcOffset(storageTimeZone) const jDate = jalaali.toJalaali(date.year(), date.month() + 1, date.date()) return jalaliMonths[jDate.jm - 1] || 'نا معلوم' } if (dayjs(input, resolvedInFormat).isValid()) { const date = dayjs(input, resolvedInFormat) const jDate = jalaali.toJalaali(date.year(), date.month() + 1, date.date()) return resolvedOutFormat .replace('jYYYY', jDate.jy.toString()) .replace('jMM', String(jDate.jm).padStart(2, '0')) .replace('jDD', String(jDate.jd).padStart(2, '0')) } return 'ثبت نشده' }