DateTimeFormat.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /*
  2. * Copyright (c) 2021-2024, Tim Flynn <trflynn89@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Optional.h>
  8. #include <AK/String.h>
  9. #include <AK/StringView.h>
  10. #include <AK/Time.h>
  11. #include <AK/Types.h>
  12. #include <AK/Vector.h>
  13. #include <LibUnicode/Forward.h>
  14. namespace Unicode {
  15. enum class DateTimeStyle {
  16. Full,
  17. Long,
  18. Medium,
  19. Short,
  20. };
  21. DateTimeStyle date_time_style_from_string(StringView);
  22. StringView date_time_style_to_string(DateTimeStyle);
  23. enum class Weekday {
  24. Sunday,
  25. Monday,
  26. Tuesday,
  27. Wednesday,
  28. Thursday,
  29. Friday,
  30. Saturday,
  31. };
  32. enum class HourCycle {
  33. H11,
  34. H12,
  35. H23,
  36. H24,
  37. };
  38. HourCycle hour_cycle_from_string(StringView hour_cycle);
  39. StringView hour_cycle_to_string(HourCycle hour_cycle);
  40. Optional<HourCycle> default_hour_cycle(StringView locale);
  41. enum class CalendarPatternStyle {
  42. Narrow,
  43. Short,
  44. Long,
  45. Numeric,
  46. TwoDigit,
  47. ShortOffset,
  48. LongOffset,
  49. ShortGeneric,
  50. LongGeneric,
  51. };
  52. CalendarPatternStyle calendar_pattern_style_from_string(StringView style);
  53. StringView calendar_pattern_style_to_string(CalendarPatternStyle style);
  54. struct CalendarPattern {
  55. static CalendarPattern create_from_pattern(StringView);
  56. String to_pattern() const;
  57. template<typename Callback>
  58. void for_each_calendar_field_zipped_with(CalendarPattern const& other, Callback&& callback)
  59. {
  60. callback(hour_cycle, other.hour_cycle);
  61. callback(era, other.era);
  62. callback(year, other.year);
  63. callback(month, other.month);
  64. callback(weekday, other.weekday);
  65. callback(day, other.day);
  66. callback(day_period, other.day_period);
  67. callback(hour, other.hour);
  68. callback(minute, other.minute);
  69. callback(second, other.second);
  70. callback(fractional_second_digits, other.fractional_second_digits);
  71. callback(time_zone_name, other.time_zone_name);
  72. }
  73. Optional<HourCycle> hour_cycle;
  74. Optional<bool> hour12;
  75. // https://unicode.org/reports/tr35/tr35-dates.html#Calendar_Fields
  76. Optional<CalendarPatternStyle> era;
  77. Optional<CalendarPatternStyle> year;
  78. Optional<CalendarPatternStyle> month;
  79. Optional<CalendarPatternStyle> weekday;
  80. Optional<CalendarPatternStyle> day;
  81. Optional<CalendarPatternStyle> day_period;
  82. Optional<CalendarPatternStyle> hour;
  83. Optional<CalendarPatternStyle> minute;
  84. Optional<CalendarPatternStyle> second;
  85. Optional<u8> fractional_second_digits;
  86. Optional<CalendarPatternStyle> time_zone_name;
  87. };
  88. class DateTimeFormat {
  89. public:
  90. static NonnullOwnPtr<DateTimeFormat> create_for_date_and_time_style(
  91. StringView locale,
  92. StringView time_zone_identifier,
  93. Optional<HourCycle> const& hour_cycle,
  94. Optional<bool> const& hour12,
  95. Optional<DateTimeStyle> const& date_style,
  96. Optional<DateTimeStyle> const& time_style);
  97. static NonnullOwnPtr<DateTimeFormat> create_for_pattern_options(
  98. StringView locale,
  99. StringView time_zone_identifier,
  100. CalendarPattern const&);
  101. virtual ~DateTimeFormat() = default;
  102. struct Partition {
  103. StringView type;
  104. String value;
  105. StringView source;
  106. };
  107. virtual CalendarPattern const& chosen_pattern() const = 0;
  108. virtual String format(double) const = 0;
  109. virtual Vector<Partition> format_to_parts(double) const = 0;
  110. virtual String format_range(double, double) const = 0;
  111. virtual Vector<Partition> format_range_to_parts(double, double) const = 0;
  112. protected:
  113. DateTimeFormat() = default;
  114. };
  115. struct WeekInfo {
  116. u8 minimal_days_in_first_week { 1 };
  117. Optional<Weekday> first_day_of_week;
  118. Vector<Weekday> weekend_days;
  119. };
  120. WeekInfo week_info_of_locale(StringView locale);
  121. }