DateTimeFormat.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. /*
  2. * Copyright (c) 2021-2023, Tim Flynn <trflynn89@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Error.h>
  8. #include <AK/Optional.h>
  9. #include <AK/String.h>
  10. #include <AK/StringView.h>
  11. #include <AK/Time.h>
  12. #include <AK/Types.h>
  13. #include <AK/Vector.h>
  14. #include <LibLocale/Forward.h>
  15. #include <LibTimeZone/TimeZone.h>
  16. namespace Locale {
  17. enum class Era : u8 {
  18. BC,
  19. AD,
  20. };
  21. enum class Month : u8 {
  22. January,
  23. February,
  24. March,
  25. April,
  26. May,
  27. June,
  28. July,
  29. August,
  30. September,
  31. October,
  32. November,
  33. December,
  34. };
  35. enum class Weekday : u8 {
  36. Sunday,
  37. Monday,
  38. Tuesday,
  39. Wednesday,
  40. Thursday,
  41. Friday,
  42. Saturday,
  43. };
  44. enum class DayPeriod : u8 {
  45. AM,
  46. PM,
  47. Noon,
  48. Morning1,
  49. Morning2,
  50. Afternoon1,
  51. Afternoon2,
  52. Evening1,
  53. Evening2,
  54. Night1,
  55. Night2,
  56. };
  57. enum class HourCycle : u8 {
  58. H11,
  59. H12,
  60. H23,
  61. H24,
  62. };
  63. enum class CalendarPatternStyle : u8 {
  64. Narrow,
  65. Short,
  66. Long,
  67. Numeric,
  68. TwoDigit,
  69. ShortOffset,
  70. LongOffset,
  71. ShortGeneric,
  72. LongGeneric,
  73. };
  74. struct CalendarPattern {
  75. enum class Field {
  76. Era,
  77. Year,
  78. Month,
  79. Weekday,
  80. Day,
  81. DayPeriod,
  82. Hour,
  83. Minute,
  84. Second,
  85. FractionalSecondDigits,
  86. TimeZoneName,
  87. };
  88. template<typename Callback>
  89. void for_each_calendar_field_zipped_with(CalendarPattern const& other, Callback&& callback)
  90. {
  91. callback(era, other.era, Field::Era);
  92. callback(year, other.year, Field::Year);
  93. callback(month, other.month, Field::Month);
  94. callback(weekday, other.weekday, Field::Weekday);
  95. callback(day, other.day, Field::Day);
  96. callback(day_period, other.day_period, Field::DayPeriod);
  97. callback(hour, other.hour, Field::Hour);
  98. callback(minute, other.minute, Field::Minute);
  99. callback(second, other.second, Field::Second);
  100. callback(fractional_second_digits, other.fractional_second_digits, Field::FractionalSecondDigits);
  101. callback(time_zone_name, other.time_zone_name, Field::TimeZoneName);
  102. }
  103. String skeleton {};
  104. String pattern {};
  105. Optional<String> pattern12 {};
  106. Optional<HourCycle> hour_cycle {};
  107. // https://unicode.org/reports/tr35/tr35-dates.html#Calendar_Fields
  108. Optional<CalendarPatternStyle> era {};
  109. Optional<CalendarPatternStyle> year {};
  110. Optional<CalendarPatternStyle> month {};
  111. Optional<CalendarPatternStyle> weekday {};
  112. Optional<CalendarPatternStyle> day {};
  113. Optional<CalendarPatternStyle> day_period {};
  114. Optional<CalendarPatternStyle> hour {};
  115. Optional<CalendarPatternStyle> minute {};
  116. Optional<CalendarPatternStyle> second {};
  117. Optional<u8> fractional_second_digits {};
  118. Optional<CalendarPatternStyle> time_zone_name {};
  119. };
  120. struct CalendarRangePattern : public CalendarPattern {
  121. enum class Field {
  122. Era,
  123. Year,
  124. Month,
  125. Day,
  126. AmPm,
  127. DayPeriod,
  128. Hour,
  129. Minute,
  130. Second,
  131. FractionalSecondDigits,
  132. };
  133. Optional<Field> field {};
  134. String start_range {};
  135. StringView separator {};
  136. String end_range {};
  137. };
  138. enum class CalendarFormatType : u8 {
  139. Date,
  140. Time,
  141. DateTime,
  142. };
  143. struct CalendarFormat {
  144. CalendarPattern full_format {};
  145. CalendarPattern long_format {};
  146. CalendarPattern medium_format {};
  147. CalendarPattern short_format {};
  148. };
  149. enum class CalendarSymbol : u8 {
  150. DayPeriod,
  151. Era,
  152. Month,
  153. Weekday,
  154. };
  155. struct TimeZoneFormat {
  156. StringView symbol_ahead_sign {};
  157. StringView symbol_ahead_separator {};
  158. StringView symbol_behind_sign {};
  159. StringView symbol_behind_separator {};
  160. StringView gmt_format {};
  161. StringView gmt_zero_format {};
  162. };
  163. HourCycle hour_cycle_from_string(StringView hour_cycle);
  164. StringView hour_cycle_to_string(HourCycle hour_cycle);
  165. CalendarPatternStyle calendar_pattern_style_from_string(StringView style);
  166. StringView calendar_pattern_style_to_string(CalendarPatternStyle style);
  167. Optional<HourCycleRegion> hour_cycle_region_from_string(StringView hour_cycle_region);
  168. ErrorOr<Vector<HourCycle>> get_regional_hour_cycles(StringView region);
  169. ErrorOr<Vector<HourCycle>> get_locale_hour_cycles(StringView locale);
  170. ErrorOr<Optional<HourCycle>> get_default_regional_hour_cycle(StringView locale);
  171. Optional<MinimumDaysRegion> minimum_days_region_from_string(StringView minimum_days_region);
  172. Optional<u8> get_regional_minimum_days(StringView region);
  173. ErrorOr<Optional<u8>> get_locale_minimum_days(StringView locale);
  174. Optional<FirstDayRegion> first_day_region_from_string(StringView first_day_region);
  175. Optional<Weekday> get_regional_first_day(StringView region);
  176. ErrorOr<Optional<Weekday>> get_locale_first_day(StringView locale);
  177. Optional<WeekendStartRegion> weekend_start_region_from_string(StringView weekend_start_region);
  178. Optional<Weekday> get_regional_weekend_start(StringView region);
  179. ErrorOr<Optional<Weekday>> get_locale_weekend_start(StringView locale);
  180. Optional<WeekendEndRegion> weekend_end_region_from_string(StringView weekend_end_region);
  181. Optional<Weekday> get_regional_weekend_end(StringView region);
  182. ErrorOr<Optional<Weekday>> get_locale_weekend_end(StringView locale);
  183. ErrorOr<String> combine_skeletons(StringView first, StringView second);
  184. ErrorOr<Optional<CalendarFormat>> get_calendar_date_format(StringView locale, StringView calendar);
  185. ErrorOr<Optional<CalendarFormat>> get_calendar_time_format(StringView locale, StringView calendar);
  186. ErrorOr<Optional<CalendarFormat>> get_calendar_date_time_format(StringView locale, StringView calendar);
  187. ErrorOr<Optional<CalendarFormat>> get_calendar_format(StringView locale, StringView calendar, CalendarFormatType type);
  188. ErrorOr<Vector<CalendarPattern>> get_calendar_available_formats(StringView locale, StringView calendar);
  189. ErrorOr<Optional<CalendarRangePattern>> get_calendar_default_range_format(StringView locale, StringView calendar);
  190. ErrorOr<Vector<CalendarRangePattern>> get_calendar_range_formats(StringView locale, StringView calendar, StringView skeleton);
  191. ErrorOr<Vector<CalendarRangePattern>> get_calendar_range12_formats(StringView locale, StringView calendar, StringView skeleton);
  192. ErrorOr<Optional<StringView>> get_calendar_era_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Era value);
  193. ErrorOr<Optional<StringView>> get_calendar_month_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Month value);
  194. ErrorOr<Optional<StringView>> get_calendar_weekday_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Weekday value);
  195. ErrorOr<Optional<StringView>> get_calendar_day_period_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, DayPeriod value);
  196. ErrorOr<Optional<StringView>> get_calendar_day_period_symbol_for_hour(StringView locale, StringView calendar, CalendarPatternStyle style, u8 hour);
  197. ErrorOr<String> format_time_zone(StringView locale, StringView time_zone, CalendarPatternStyle style, AK::Time time);
  198. Optional<StringView> get_time_zone_name(StringView locale, StringView time_zone, CalendarPatternStyle style, TimeZone::InDST in_dst);
  199. Optional<TimeZoneFormat> get_time_zone_format(StringView locale);
  200. }