<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Harsh Yadav</title>
    <description>The latest articles on DEV Community by Harsh Yadav (@harsh_yadav_5939).</description>
    <link>https://dev.to/harsh_yadav_5939</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4095013%2F52ae96c5-c6e9-4684-ae35-9c5ae2bddcf5.jpg</url>
      <title>DEV Community: Harsh Yadav</title>
      <link>https://dev.to/harsh_yadav_5939</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/harsh_yadav_5939"/>
    <language>en</language>
    <item>
      <title>The Complete Flutter DateTime Toolkit You Didn't Know You Needed</title>
      <dc:creator>Harsh Yadav</dc:creator>
      <pubDate>Wed, 26 Aug 2026 04:58:01 +0000</pubDate>
      <link>https://dev.to/harsh_yadav_5939/the-complete-flutter-datetime-toolkit-you-didnt-know-you-needed-4kgp</link>
      <guid>https://dev.to/harsh_yadav_5939/the-complete-flutter-datetime-toolkit-you-didnt-know-you-needed-4kgp</guid>
      <description>&lt;p&gt;The Problem Every Flutter Developer Faces&lt;/p&gt;

&lt;p&gt;You're building a chat app. You need to show "2 hours ago" next to each message. Simple enough — you write a quick function:&lt;/p&gt;

&lt;p&gt;dart&lt;br&gt;
&lt;code&gt;String getTimeAgo(DateTime date) {&lt;br&gt;
  final diff = DateTime.now().difference(date);&lt;br&gt;
  if (diff.inSeconds &amp;lt; 60) return '${diff.inSeconds} seconds ago';&lt;br&gt;
  if (diff.inMinutes &amp;lt; 60) return '${diff.inMinutes} minutes ago';&lt;br&gt;
  if (diff.inHours &amp;lt; 24) return '${diff.inHours} hours ago';&lt;br&gt;
  return '${diff.inDays} days ago';&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Works great. Ship it.&lt;/p&gt;

&lt;p&gt;Then your designer asks for "Yesterday" instead of "24 hours ago". Then your PM wants "Last week". Then a new requirement — the app needs Hindi support. Then you need a date range picker for the analytics dashboard. Then holiday-aware working day calculations for the HR module.&lt;/p&gt;

&lt;p&gt;Before you know it, you have 3 packages in your pubspec and 200 lines of scattered utility code — duplicated across every project.&lt;/p&gt;

&lt;p&gt;I've been there. That's exactly why I built smart_date_formatter.&lt;/p&gt;

&lt;p&gt;What Is smart_date_formatter?&lt;/p&gt;

&lt;p&gt;smart_date_formatter is a zero-dependency Flutter package that handles everything DateTime-related in one place.&lt;/p&gt;

&lt;p&gt;yaml&lt;br&gt;
&lt;code&gt;dependencies:&lt;br&gt;
  smart_date_formatter: ^2.6.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That's it. No intl. No timeago. No manual utility functions.&lt;/p&gt;

&lt;p&gt;Feature 1 — Relative Time That Actually Makes Sense&lt;br&gt;
dart&lt;br&gt;
&lt;code&gt;DateTime.now().subtract(Duration(seconds: 5)).timeAgo   // "Just now"&lt;br&gt;
DateTime.now().subtract(Duration(minutes: 25)).timeAgo  // "25 minutes ago"&lt;br&gt;
DateTime.now().subtract(Duration(days: 1)).timeAgo      // "Yesterday"&lt;br&gt;
DateTime.now().subtract(Duration(days: 9)).timeAgo      // "Last week"&lt;br&gt;
DateTime.now().add(Duration(days: 1)).timeAgo           // "Tomorrow"&lt;br&gt;
DateTime.now().add(Duration(days: 4)).timeAgo           // "in 4 days"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Not just "24 hours ago" — actual human-readable strings that your users will understand.&lt;/p&gt;

&lt;p&gt;Feature 2 — Custom Format Patterns&lt;/p&gt;

&lt;p&gt;No more depending on intl just for date formatting:&lt;/p&gt;

&lt;p&gt;dart&lt;br&gt;
&lt;code&gt;DateTime.now().format('dd-MM-yyyy')          // "22-08-2026"&lt;br&gt;
DateTime.now().format('EEE, dd MMM yyyy')    // "Sat, 22 Aug 2026"&lt;br&gt;
DateTime.now().format('hh:mm a')             // "11:30 PM"&lt;br&gt;
DateTime.now().toReadable                    // "Saturday, 22 August 2026"&lt;br&gt;
DateTime.now().toISO                         // "2026-08-22T23:30:00"&lt;br&gt;
Feature 3 — 16 Languages Out of the Box 🌍&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is where it gets interesting. Most date packages support English only. smart_date_formatter supports 16 languages — including 9 Indian languages:&lt;/p&gt;

&lt;p&gt;dart&lt;br&gt;
&lt;code&gt;date.timeAgoIn(SdfLocale.hi)   // "2 घंटे पहले"    Hindi&lt;br&gt;
date.timeAgoIn(SdfLocale.mr)   // "2 तास पूर्वी"   Marathi&lt;br&gt;
date.timeAgoIn(SdfLocale.gu)   // "2 કલાક પહેલાં"  Gujarati&lt;br&gt;
date.timeAgoIn(SdfLocale.bn)   // "2 ঘন্টা আগে"    Bengali&lt;br&gt;
date.timeAgoIn(SdfLocale.ta)   // "2 மணி நேரம் முன்பு" Tamil&lt;br&gt;
date.timeAgoIn(SdfLocale.te)   // "2 గంటలు క్రితం" Telugu&lt;br&gt;
date.timeAgoIn(SdfLocale.kn)   // "2 ಗಂಟೆಗಳ ಹಿಂದೆ" Kannada&lt;br&gt;
date.timeAgoIn(SdfLocale.pa)   // "2 ਘੰਟੇ ਪਹਿਲਾਂ"  Punjabi&lt;br&gt;
date.timeAgoIn(SdfLocale.de)   // "2 Stunden her"  German&lt;br&gt;
date.timeAgoIn(SdfLocale.ja)   // "2 時間前"        Japanese&lt;br&gt;
Feature 4 — Natural Language Parser 🔍&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This one surprised even me when I built it. You can parse natural language strings into DateTime:&lt;/p&gt;

&lt;p&gt;dart&lt;br&gt;
&lt;code&gt;SmartParser.parse("tomorrow")                // DateTime&lt;br&gt;
SmartParser.parse("next monday")             // DateTime&lt;br&gt;
SmartParser.parse("in 3 days")              // DateTime&lt;br&gt;
SmartParser.parse("first monday of month")  // DateTime&lt;br&gt;
SmartParser.parse("2 mondays ago")          // DateTime&lt;br&gt;
SmartParser.parse("end of this month")      // DateTime&lt;br&gt;
SmartParser.parse("q2")                     // DateTime (April)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;// And in Indian languages!&lt;br&gt;
&lt;code&gt;SmartParser.parse("कल")          // Hindi tomorrow&lt;br&gt;
SmartParser.parse("उद्या")        // Marathi tomorrow&lt;br&gt;
SmartParser.parse("நாளை")        // Tamil tomorrow&lt;br&gt;
SmartParser.parse("আগামীকাল")    // Bengali tomorrow&lt;br&gt;
SmartParser.parse("આવતી કાલ")    // Gujarati tomorrow&lt;br&gt;
Feature 5 — Flutter Widgets&lt;br&gt;
TimeAgoText — Auto Refreshing&lt;/code&gt;&lt;br&gt;
dart&lt;br&gt;
// No setState. No Timer. Just works.&lt;br&gt;
&lt;code&gt;TimeAgoText(&lt;br&gt;
  date: message.sentAt,&lt;br&gt;
  locale: SdfLocale.hi,&lt;br&gt;
  refreshRate: Duration(seconds: 30),&lt;br&gt;
)&lt;br&gt;
CountdownText — Live Countdown&lt;/code&gt;&lt;br&gt;
dart&lt;br&gt;
&lt;code&gt;CountdownText(&lt;br&gt;
  target: saleEndsAt,&lt;br&gt;
  format: '{hh}:{mm}:{ss}',&lt;br&gt;
  finishedText: 'Sale Ended!',&lt;br&gt;
  onFinished: () =&amp;gt; hideSaleBanner(),&lt;br&gt;
)&lt;br&gt;
SmartCalendar — Full Featured Calendar&lt;br&gt;
dart&lt;br&gt;
SmartCalendar(&lt;br&gt;
  events: myEvents,&lt;br&gt;
  initialView: CalendarView.month, // month/week/day/agenda&lt;br&gt;
  themeMode: ThemeMode.dark,&lt;br&gt;
  showWeekNumbers: true,&lt;br&gt;
  rangeSelectionMode: true,&lt;br&gt;
  markerStyle: EventMarkerStyle.both,&lt;br&gt;
  onDateSelected: (date, events) =&amp;gt; print(date),&lt;br&gt;
  onRangeSelected: (start, end) =&amp;gt; print('$start → $end'),&lt;br&gt;
  cellBuilder: (date, events, isSelected, isToday) {&lt;br&gt;
    // Fully custom cell UI&lt;br&gt;
    return MyCustomCell(date: date);&lt;br&gt;
  },&lt;br&gt;
)&lt;br&gt;
SmartDateField — Smart Date Input&lt;/code&gt;&lt;br&gt;
dart&lt;br&gt;
&lt;code&gt;SmartDateField(&lt;br&gt;
  label: 'Due Date',&lt;br&gt;
  enableTimePicker: true,&lt;br&gt;
  enableNaturalLanguage: true, // type "next monday"!&lt;br&gt;
  showSuggestions: true,&lt;br&gt;
  validator: (date) {&lt;br&gt;
    if (date == null) return 'Required';&lt;br&gt;
    if (date.isPast) return 'Must be future date';&lt;br&gt;
    return null;&lt;br&gt;
  },&lt;br&gt;
  onChanged: (date) =&amp;gt; setState(() =&amp;gt; _dueDate = date),&lt;br&gt;
)&lt;br&gt;
SmartDateRangePicker — Visual Range Picker&lt;/code&gt;&lt;br&gt;
dart&lt;br&gt;
&lt;code&gt;SmartDateRangePicker(&lt;br&gt;
  primaryColor: Colors.teal,&lt;br&gt;
  rangeHighlightColor: Colors.teal.withOpacity(0.15),&lt;br&gt;
  weekendColor: Colors.orange,&lt;br&gt;
  cellBorderRadius: 20,&lt;br&gt;
  presets: [&lt;br&gt;
    DateRangePreset.last7Days,&lt;br&gt;
    DateRangePreset.last30Days,&lt;br&gt;
    DateRangePreset.thisMonth,&lt;br&gt;
  ],&lt;br&gt;
  onRangeSelected: (range) {&lt;br&gt;
    print('${range.start} → ${range.end}');&lt;br&gt;
    print('${range.days} days');&lt;br&gt;
    print(range.contains(DateTime.now())); // true&lt;br&gt;
  },&lt;br&gt;
)&lt;/code&gt;&lt;br&gt;
Feature 6 — Analytics Tools 📊&lt;br&gt;
Streak Calculator&lt;br&gt;
dart&lt;br&gt;
// Perfect for habit trackers&lt;br&gt;
&lt;code&gt;StreakCalculator.currentStreak(dates)    // 7&lt;br&gt;
StreakCalculator.longestStreak(dates)    // 21&lt;br&gt;
StreakCalculator.isTodayCompleted(dates) // true&lt;br&gt;
StreakCalculator.completionRate(&lt;br&gt;
  dates,&lt;br&gt;
  start: monthStart,&lt;br&gt;
  end: monthEnd,&lt;br&gt;
) // 0.83&lt;br&gt;
Date Grouper&lt;/code&gt;&lt;br&gt;
dart&lt;br&gt;
`DateGrouper.byMonth(activityDates)&lt;br&gt;
// {'2026-06': [...], '2026-07': [...]}&lt;/p&gt;

&lt;p&gt;DateGrouper.mostActiveWeekday(dates) // "Monday"&lt;br&gt;
DateGrouper.mostActiveHour(dates)    // 14&lt;br&gt;
DateGrouper.averageGap(dates)        // Duration(days: 2)&lt;br&gt;
Feature 7 — Holiday-Aware Calculations 🎄&lt;br&gt;
dart&lt;br&gt;
final holidays = HolidayHelper.indianHolidays(2026);&lt;/p&gt;

&lt;p&gt;// Is today a holiday?&lt;br&gt;
DateTime.now().isHoliday(holidays: holidays)&lt;/p&gt;

&lt;p&gt;// Add 5 working days, skipping holidays&lt;br&gt;
date.addWorkingDaysWithHolidays(5, holidays: holidays)&lt;/p&gt;

&lt;p&gt;// Working days between two dates&lt;br&gt;
HolidayHelper.workingDaysBetween(&lt;br&gt;
  projectStart,&lt;br&gt;
  deadline,&lt;br&gt;
  holidays: holidays,&lt;br&gt;
)`&lt;br&gt;
Feature 8 — Date Range Helper 🗄️&lt;/p&gt;

&lt;p&gt;Perfect for database queries and analytics filters:&lt;/p&gt;

&lt;p&gt;dart&lt;br&gt;
`final range = DateRangeHelper.thisMonth();&lt;/p&gt;

&lt;p&gt;// SQLite&lt;br&gt;
await db.query(&lt;br&gt;
  'orders',&lt;br&gt;
  where: 'created_at BETWEEN ? AND ?',&lt;br&gt;
  whereArgs: [&lt;br&gt;
    range.start.toIso8601String(),&lt;br&gt;
    range.end.toIso8601String(),&lt;br&gt;
  ],&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;// Available ranges&lt;br&gt;
DateRangeHelper.today()&lt;br&gt;
DateRangeHelper.thisWeek()&lt;br&gt;
DateRangeHelper.lastNDays(30)&lt;br&gt;
DateRangeHelper.quarter(2)&lt;br&gt;
DateRangeHelper.currentQuarter()`&lt;br&gt;
Before vs After&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;p&gt;yaml&lt;br&gt;
&lt;code&gt;dependencies:&lt;br&gt;
  timeago: ^3.6.0&lt;br&gt;
  intl: ^0.18.0&lt;/code&gt;&lt;br&gt;
  # + 200 lines of manual utility code&lt;br&gt;
  # + copy-pasted across every project&lt;/p&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;p&gt;yaml&lt;br&gt;
&lt;code&gt;dependencies:&lt;br&gt;
  smart_date_formatter: ^2.6.0&lt;/code&gt;&lt;br&gt;
  # done.&lt;br&gt;
The Numbers&lt;br&gt;
📦 Zero external dependencies&lt;br&gt;
🌍 16 languages supported&lt;br&gt;
🧪 300+ tests&lt;br&gt;
⭐ 160/160 pub points (perfect score)&lt;br&gt;
📱 All platforms: Android, iOS, Web, Windows, macOS, Linux&lt;br&gt;
🔄 20+ versions released&lt;br&gt;
Try It Live&lt;/p&gt;

&lt;p&gt;Before adding it to your project, try every feature interactively:&lt;/p&gt;

&lt;p&gt;👉 Live Playground&lt;/p&gt;

&lt;p&gt;No installation. No setup. Just open and explore.&lt;/p&gt;

&lt;p&gt;Get Started&lt;br&gt;
bash&lt;br&gt;
dart pub add smart_date_formatter&lt;br&gt;
dart&lt;br&gt;
import 'package:smart_date_formatter/smart_date_formatter.dart';&lt;/p&gt;

&lt;p&gt;// That's it. Start using it.&lt;br&gt;
DateTime.now().timeAgo        // "Just now"&lt;br&gt;
DateTime.now().calendar       // "Today"&lt;br&gt;
DateTime.now().toReadable     // "Saturday, 22 August 2026"&lt;br&gt;
Resources&lt;br&gt;
📦 pub.dev: &lt;a href="//pub.dev/packages/smart_date_formatter"&gt;pub.dev&lt;/a&gt;&lt;br&gt;
💻 GitHub: &lt;a href="//github.com/harshyadavDeveloper/smart_date_formatter"&gt;Github&lt;/a&gt;&lt;br&gt;
🌐 Live Playground: &lt;a href="https://smart-date-formatter.netlify.app" rel="noopener noreferrer"&gt;Live&lt;/a&gt;&lt;br&gt;
🐛 Issues: &lt;a href="https://github.com/harshyadavDeveloper/smart_date_formatter/issues" rel="noopener noreferrer"&gt;GitHub Issues&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If this saved you time, please ⭐ the repo and 👍 like it on pub.dev — it helps other Flutter developers discover it.&lt;/p&gt;

&lt;p&gt;— Harsh Yadav, Flutter Developer&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
