ddate.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. * Copyright (c) 2021, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/String.h>
  7. #include <LibCore/DateTime.h>
  8. #include <LibCore/System.h>
  9. #include <LibMain/Main.h>
  10. #include <time.h>
  11. #include <unistd.h>
  12. class DiscordianDate {
  13. public:
  14. explicit DiscordianDate(Core::DateTime date)
  15. {
  16. m_gregorian_date = date;
  17. m_yold = date.year() + 1166;
  18. uint16_t day = day_of_yold() + 1;
  19. if (is_leap_year() && day > m_st_tibs_day_of_yold)
  20. --day;
  21. m_day_of_week = day_of_week_from_day_of_yold(day);
  22. m_season = season_from_day_of_yold(day);
  23. m_date = date_from_day_of_yold(day);
  24. }
  25. const char* day_of_week() { return m_day_of_week.characters(); };
  26. const char* season() { return m_season.characters(); };
  27. uint16_t year() { return yold(); };
  28. uint16_t yold() { return m_yold; };
  29. uint16_t day_of_year() { return day_of_yold(); };
  30. uint16_t day_of_yold() { return m_gregorian_date.day_of_year(); };
  31. bool is_leap_year() { return m_gregorian_date.is_leap_year(); };
  32. bool is_st_tibs_day() { return (is_leap_year() && (day_of_yold() + 1) == m_st_tibs_day_of_yold); };
  33. String to_string()
  34. {
  35. if (is_st_tibs_day())
  36. return String::formatted("St. Tib's Day, in the YOLD {}", m_yold);
  37. return String::formatted("{}, day {} of {}, in the YOLD {}", m_day_of_week, m_date, m_season, m_yold);
  38. }
  39. private:
  40. static const int m_days_in_week = 5;
  41. static const int m_days_in_season = 73;
  42. static const int m_st_tibs_day_of_yold = 60;
  43. Core::DateTime m_gregorian_date;
  44. String m_day_of_week;
  45. String m_season;
  46. int m_date;
  47. uint64_t m_yold; // 64-bit for use after X-Day in the YOLD 8661
  48. int date_from_day_of_yold(uint16_t day)
  49. {
  50. return (day % m_days_in_season == 0 ? m_days_in_season : day % m_days_in_season);
  51. }
  52. const char* day_of_week_from_day_of_yold(uint16_t day)
  53. {
  54. if (is_st_tibs_day())
  55. return nullptr;
  56. switch ((day % m_days_in_week) == 0 ? m_days_in_week : (day % m_days_in_week)) {
  57. case 1:
  58. return "Sweetmorn";
  59. case 2:
  60. return "Boomtime";
  61. case 3:
  62. return "Pungenday";
  63. case 4:
  64. return "Prickle-Prickle";
  65. case 5:
  66. return "Setting Orange";
  67. default:
  68. return nullptr;
  69. }
  70. }
  71. const char* season_from_day_of_yold(uint16_t day)
  72. {
  73. if (is_st_tibs_day())
  74. return nullptr;
  75. switch (((day % m_days_in_season) == 0 ? day - 1 : day) / m_days_in_season) {
  76. case 0:
  77. return "Chaos";
  78. case 1:
  79. return "Discord";
  80. case 2:
  81. return "Confusion";
  82. case 3:
  83. return "Bureaucracy";
  84. case 4:
  85. return "The Aftermath";
  86. default:
  87. return nullptr;
  88. }
  89. }
  90. };
  91. ErrorOr<int> serenity_main(Main::Arguments)
  92. {
  93. TRY(Core::System::pledge("stdio rpath"));
  94. tzset();
  95. auto date = Core::DateTime::now();
  96. outln("Today is {}", DiscordianDate(date).to_string());
  97. return 0;
  98. }