| // Copyright 2015 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | // Forked from https://github.com/dart-lang/sdk/blob/master/samples-dev/swarm/swarm_ui_lib/util/DateUtils.dart | 
 | class DateUtils { | 
 |  | 
 |   static const WEEKDAYS = const ['Monday', 'Tuesday', 'Wednesday', 'Thursday', | 
 |                                  'Friday', 'Saturday', 'Sunday']; | 
 |  | 
 |   static const YESTERDAY = 'Yesterday'; | 
 |  | 
 |   static const MS_IN_WEEK = DateTime.DAYS_PER_WEEK * Duration.MILLISECONDS_PER_DAY; | 
 |  | 
 |   // TODO(jmesserly): locale specific date format | 
 |   static String _twoDigits(int n) { | 
 |     if (n >= 10) | 
 |       return '$n'; | 
 |     return '0$n'; | 
 |   } | 
 |  | 
 |   /// Formats a time in H:MM A format | 
 |   static String toHourMinutesString(Duration duration) { | 
 |     assert(duration.inDays == 0); | 
 |     int hours = duration.inHours; | 
 |     String a; | 
 |     if (hours >= 12) { | 
 |       a = 'pm'; | 
 |       if (hours != 12) | 
 |         hours -= 12; | 
 |     } else { | 
 |       a = 'am'; | 
 |       if (hours == 0) | 
 |         hours += 12; | 
 |     } | 
 |     String twoDigits(int n) { | 
 |       if (n >= 10) | 
 |         return '$n'; | 
 |       return '0$n'; | 
 |     } | 
 |     String mm = twoDigits(duration.inMinutes.remainder(Duration.MINUTES_PER_HOUR)); | 
 |     return '$hours:$mm $a'; | 
 |   } | 
 |  | 
 |   /// A date/time formatter that takes into account the current date/time: | 
 |   ///  - if it's from today, just show the time | 
 |   ///  - if it's from yesterday, just show 'Yesterday' | 
 |   ///  - if it's from the same week, just show the weekday | 
 |   ///  - otherwise, show just the date | 
 |   static String toRecentTimeString(DateTime then) { | 
 |     bool datesAreEqual(DateTime d1, DateTime d2) { | 
 |       return (d1.year == d2.year) && | 
 |              (d1.month == d2.month) && | 
 |              (d1.day == d2.day); | 
 |     } | 
 |  | 
 |     final now = new DateTime.now(); | 
 |     if (datesAreEqual(then, now)) { | 
 |       return toHourMinutesString(new Duration( | 
 |         days: 0, | 
 |         hours: then.hour, | 
 |         minutes: then.minute, | 
 |         seconds: then.second, | 
 |         milliseconds: then.millisecond) | 
 |       ); | 
 |     } | 
 |  | 
 |     final today = new DateTime(now.year, now.month, now.day, 0, 0, 0, 0); | 
 |     Duration delta = today.difference(then); | 
 |     if (delta.inMilliseconds < Duration.MILLISECONDS_PER_DAY) { | 
 |       return YESTERDAY; | 
 |     } else if (delta.inMilliseconds < MS_IN_WEEK) { | 
 |       return WEEKDAYS[then.weekday]; | 
 |     } else { | 
 |       String twoDigitMonth = _twoDigits(then.month); | 
 |       String twoDigitDay = _twoDigits(then.day); | 
 |       return '${then.year}-$twoDigitMonth-$twoDigitDay'; | 
 |     } | 
 |   } | 
 |  | 
 |   static String toDateString(DateTime then) { | 
 |     // TODO(jmesserly): locale specific date format | 
 |     String twoDigitMonth = _twoDigits(then.month); | 
 |     String twoDigitDay = _twoDigits(then.day); | 
 |     return '${then.year}-$twoDigitMonth-$twoDigitDay'; | 
 |   } | 
 | } |