|
| 1 | +using System; |
| 2 | +using System.Globalization; |
| 3 | + |
| 4 | +namespace GitHub.UI |
| 5 | +{ |
| 6 | + public class DurationToStringConverter : ValueConverterMarkupExtension<DurationToStringConverter> |
| 7 | + { |
| 8 | + public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) |
| 9 | + { |
| 10 | + const int year = 365; |
| 11 | + const int month = 30; |
| 12 | + const int day = 24; |
| 13 | + const int hour = 60; |
| 14 | + const int minute = 60; |
| 15 | + |
| 16 | + TimeSpan duration; |
| 17 | + if (value is TimeSpan) |
| 18 | + duration = (TimeSpan)value; |
| 19 | + else if (value is DateTime) |
| 20 | + duration = DateTime.UtcNow - (DateTime)value; |
| 21 | + else if (value is DateTimeOffset) |
| 22 | + duration = DateTimeOffset.UtcNow - (DateTimeOffset)value; |
| 23 | + else |
| 24 | + return value; |
| 25 | + |
| 26 | + if (duration.TotalDays >= year) |
| 27 | + return string.Format(culture, (int)(duration.TotalDays / year) > 1 ? Resources.years : Resources.year, (int)(duration.TotalDays / year)); |
| 28 | + else if (duration.TotalDays >= 360) |
| 29 | + return string.Format(culture, Resources.months, 11); |
| 30 | + else if (duration.TotalDays >= month) |
| 31 | + return string.Format(culture, (int)(duration.TotalDays / (month)) > 1 ? Resources.months : Resources.month, (int)(duration.TotalDays / (month))); |
| 32 | + else if (duration.TotalHours >= day) |
| 33 | + return string.Format(culture, (int)(duration.TotalHours / day) > 1 ? Resources.days : Resources.day, (int)(duration.TotalHours / day)); |
| 34 | + else if (duration.TotalMinutes >= hour) |
| 35 | + return string.Format(culture, (int)(duration.TotalMinutes / hour) > 1 ? Resources.hours : Resources.hour, (int)(duration.TotalMinutes / hour)); |
| 36 | + else if (duration.TotalSeconds >= minute) |
| 37 | + return string.Format(culture, (int)(duration.TotalSeconds / minute) > 1 ? Resources.minutes : Resources.minute, (int)(duration.TotalSeconds / minute)); |
| 38 | + return string.Format(culture, duration.TotalSeconds > 1 ? Resources.seconds : Resources.second, duration.TotalSeconds); |
| 39 | + } |
| 40 | + } |
| 41 | +} |
0 commit comments