DateTimeToAgeConverter.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System;
  2. namespace InABox.Mobile
  3. {
  4. public class DateTimeToAgeConverter : AbstractConverter<DateTime, String>
  5. {
  6. public static string FormatTime(DateTime date)
  7. {
  8. DateTime now = DateTime.Now;
  9. String prefix = date > now ? "In" : "";
  10. String suffix = date <= now ? "ago" : "";
  11. TimeSpan span = date > now ? date - now : now - date;
  12. if (span.Days > 365)
  13. {
  14. int years = (span.Days / 365);
  15. if (span.Days % 365 != 0)
  16. years += 1;
  17. return String.Format("{0} {1} {2} {3}",
  18. prefix,
  19. years,
  20. years == 1 ? "year" : "years",
  21. suffix).Trim();
  22. }
  23. if (span.Days > 30)
  24. {
  25. int months = (span.Days / 30);
  26. if (span.Days % 31 != 0)
  27. months += 1;
  28. return String.Format("{0} {1} {2} {3}",
  29. prefix,
  30. months,
  31. months == 1 ? "month" : "months",
  32. suffix).Trim();
  33. }
  34. if (span.Days > 0)
  35. return String.Format("{0} {1} {2} {3}",
  36. prefix,
  37. span.Days,
  38. span.Days == 1 ? "day" : "days",
  39. suffix).Trim();
  40. if (span.Hours > 0)
  41. return String.Format("{0} about {1} {2} {3}",
  42. prefix,
  43. span.Hours,
  44. span.Hours == 1 ? "hour" : "hours",
  45. suffix);
  46. if (span.Minutes > 0)
  47. return String.Format("{0} {1} {2} {3}",
  48. prefix,
  49. span.Minutes,
  50. span.Minutes == 1 ? "minute" : "minutes",
  51. suffix).Trim();
  52. if (span.Seconds > 5)
  53. return String.Format("{0} {1} seconds {2}",
  54. prefix,
  55. span.Seconds,
  56. suffix).Trim();
  57. if (span.Seconds <= 5)
  58. return date > now
  59. ? "Imminently"
  60. : "Just now";
  61. return string.Empty;
  62. }
  63. protected override string Convert(DateTime value, object? parameter = null)
  64. {
  65. return FormatTime(value);
  66. }
  67. }
  68. }