Articles

تبدیل تاریخ میلادی به شمسی در Dart و Flutter

نصب jalali_date، تبدیل و قالب‌بندی تاریخ شمسی با نام‌های فارسی و استفاده از انتخابگر تاریخ در Flutter.

برای نمایش تاریخ شمسی در برنامه‌ی Dart یا Flutter، از jalali_date استفاده می‌کنم. این بسته تاریخ میلادی را به شمسی تبدیل می‌کند و نام ماه‌ها و روزهای هفته را هم دارد. برای انتخاب تاریخ در Flutter، بسته‌ی جداگانه‌ی jalali_calendar_picker را به کار می‌برم.

نصب

در پروژه‌ی Dart، وابستگی را اضافه کنید:

sh
dart pub add jalali_date

در Flutter، برای انتخابگر تاریخ این بسته را هم اضافه کنید:

sh
flutter pub add jalali_calendar_picker

راهنمای نصب و شروع کار جزئیات بیشتری دارد. در برنامه‌ی Dart، این کتابخانه را وارد کنید:

dart
import 'package:jalali_date/jalali_date.dart';

تبدیل تاریخ میلادی

برای ساخت تاریخ شمسی از اجزای یک تاریخ میلادی، از PersianDate.fromGregorian استفاده می‌کنم:

dart
final date = PersianDate.fromGregorian(2021, 3, 21);
print(date); // 1400/01/01

اگر از قبل یک DateTime دارید، می‌توانید آن را به تاریخ شمسی تبدیل کنید. این روش ساعت روز و منطقه‌ی زمانی را نگه می‌دارد:

dart
final date = DateTime.now().toPersianDate();

تاریخ ساخته‌شده با PersianDate.fromGregorian از مقادیر سال، ماه و روز میلادی استفاده می‌کند. سازنده‌ی PersianDate(year, month, day) برعکس، مقادیر شمسی می‌گیرد. راهنمای تبدیل تاریخ حالت‌های بیشتر را توضیح می‌دهد.

برای برگشت به میلادی، toDateTime() را صدا بزنید. PersianDate تغییرناپذیر است؛ برای جابه‌جایی روز یا ماه از عملیات تاریخ استفاده کنید.

نمایش نام‌های فارسی

برای چاپ روز هفته، روز، نام ماه و سال، از الگوی format استفاده کنید:

dart
print(date.format('EEEE d MMMM yyyy'));

نام روز و ماه به فارسی نمایش داده می‌شود. می‌توانید رقم‌های فارسی را هم فعال کنید:

dart
print(date.format('EEEE d MMMM yyyy', persianDigits: true));

توکن‌های دیگر و گزینه‌های قالب‌بندی در راهنمای قالب‌بندی آمده‌اند. اگر متن تاریخ شمسی را می‌خوانید، PersianDate.parse و PersianDate.parseFormat هم در دسترس‌اند.

برای مرتب‌سازی یا مقایسه، خود مقدار PersianDate را نگه دارید، نه متن قالب‌بندی‌شده را. weekdayPersian روز هفته را از شنبه می‌شمارد، همان چیزی که یک جدول تقویم فارسی لازم دارد.

انتخاب تاریخ در Flutter

بسته‌ی jalali_calendar_picker، بسته‌ی jalali_date را دوباره صادر می‌کند. بنابراین برای استفاده از انتخابگر فقط یک import لازم است:

dart
import 'package:jalali_calendar_picker/jalali_calendar_picker.dart';

در یک متد async ویجت، پنجره‌ی انتخاب تاریخ را باز کنید:

dart
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 یک بازه برمی‌گرداند.

اگر تاریخی اشتباه درآمد، در گیت‌هاب گزارش کنید.