تبدیل تاریخ میلادی به شمسی در Dart و Flutter
نصب jalali_date، تبدیل و قالببندی تاریخ شمسی با نامهای فارسی و استفاده از انتخابگر تاریخ در Flutter.
برای نمایش تاریخ شمسی در برنامهی Dart یا Flutter، از jalali_date استفاده میکنم. این بسته تاریخ میلادی را به شمسی تبدیل میکند و نام ماهها و روزهای هفته را هم دارد. برای انتخاب تاریخ در Flutter، بستهی جداگانهی jalali_calendar_picker را به کار میبرم.
نصب
در پروژهی Dart، وابستگی را اضافه کنید:
dart pub add jalali_dateدر Flutter، برای انتخابگر تاریخ این بسته را هم اضافه کنید:
flutter pub add jalali_calendar_pickerراهنمای نصب و شروع کار جزئیات بیشتری دارد. در برنامهی Dart، این کتابخانه را وارد کنید:
import 'package:jalali_date/jalali_date.dart';تبدیل تاریخ میلادی
برای ساخت تاریخ شمسی از اجزای یک تاریخ میلادی، از PersianDate.fromGregorian استفاده میکنم:
final date = PersianDate.fromGregorian(2021, 3, 21);
print(date); // 1400/01/01اگر از قبل یک DateTime دارید، میتوانید آن را به تاریخ شمسی تبدیل کنید. این روش ساعت روز و منطقهی زمانی را نگه میدارد:
final date = DateTime.now().toPersianDate();تاریخ ساختهشده با PersianDate.fromGregorian از مقادیر سال، ماه و روز میلادی استفاده میکند. سازندهی PersianDate(year, month, day) برعکس، مقادیر شمسی میگیرد. راهنمای تبدیل تاریخ حالتهای بیشتر را توضیح میدهد.
برای برگشت به میلادی، toDateTime() را صدا بزنید. PersianDate تغییرناپذیر است؛ برای جابهجایی روز یا ماه از عملیات تاریخ استفاده کنید.
نمایش نامهای فارسی
برای چاپ روز هفته، روز، نام ماه و سال، از الگوی format استفاده کنید:
print(date.format('EEEE d MMMM yyyy'));نام روز و ماه به فارسی نمایش داده میشود. میتوانید رقمهای فارسی را هم فعال کنید:
print(date.format('EEEE d MMMM yyyy', persianDigits: true));توکنهای دیگر و گزینههای قالببندی در راهنمای قالببندی آمدهاند. اگر متن تاریخ شمسی را میخوانید، PersianDate.parse و PersianDate.parseFormat هم در دسترساند.
برای مرتبسازی یا مقایسه، خود مقدار PersianDate را نگه دارید، نه متن قالببندیشده را. weekdayPersian روز هفته را از شنبه میشمارد، همان چیزی که یک جدول تقویم فارسی لازم دارد.
انتخاب تاریخ در Flutter
بستهی jalali_calendar_picker، بستهی jalali_date را دوباره صادر میکند. بنابراین برای استفاده از انتخابگر فقط یک import لازم است:
import 'package:jalali_calendar_picker/jalali_calendar_picker.dart';در یک متد async ویجت، پنجرهی انتخاب تاریخ را باز کنید:
final date = await showPersianDatePicker(
context: context,
initialDate: PersianDate.now(),
firstDate: PersianDate(1400, 1, 1),
lastDate: PersianDate(1410, 12, 29),
);
if (date != null) print(date.format('EEEE d MMMM yyyy'));انتخابگر از رقمهای فارسی و چینش راستبهچپ استفاده میکند. همچنین میتوانید تاریخ آغاز و پایان را محدود کنید. صفحهی انتخابگر تاریخ Flutter گزینههای دیگر را فهرست میکند.
اگر کاربر پنجره را ببندد، نتیجه null است. با selectableDayPredicate میتوان روزهایی مثل تعطیلات رسمی را غیرفعال کرد، و showPersianDateRangePicker یک بازه برمیگرداند.
اگر تاریخی اشتباه درآمد، در گیتهاب گزارش کنید.