1 /* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #ifndef OHOS_GLOBAL_I18N_DATE_TIME_FORMAT_H 16 #define OHOS_GLOBAL_I18N_DATE_TIME_FORMAT_H 17 18 #include <map> 19 #include <vector> 20 #include <climits> 21 #include <set> 22 #include <unordered_map> 23 #include "locale_info.h" 24 #include "unicode/datefmt.h" 25 #include "unicode/dtptngen.h" 26 #include "unicode/localebuilder.h" 27 #include "unicode/locid.h" 28 #include "unicode/smpdtfmt.h" 29 #include "unicode/timezone.h" 30 #include "unicode/calendar.h" 31 #include "unicode/numsys.h" 32 #include "unicode/dtitvfmt.h" 33 34 namespace OHOS { 35 namespace Global { 36 namespace I18n { 37 class DateTimeFormat { 38 public: 39 DateTimeFormat(const std::vector<std::string> &localeTags, std::map<std::string, std::string> &configs); 40 virtual ~DateTimeFormat(); 41 std::string Format(int64_t milliseconds); 42 std::string FormatRange(int64_t fromMilliseconds, int64_t toMilliseconds); 43 void GetResolvedOptions(std::map<std::string, std::string> &map); 44 std::string GetDateStyle() const; 45 std::string GetTimeStyle() const; 46 std::string GetHourCycle() const; 47 std::string GetTimeZone() const; 48 std::string GetTimeZoneName() const; 49 std::string GetNumberingSystem() const; 50 std::string GetHour12() const; 51 std::string GetWeekday() const; 52 std::string GetEra() const; 53 std::string GetYear() const; 54 std::string GetMonth() const; 55 std::string GetDay() const; 56 std::string GetHour() const; 57 std::string GetMinute() const; 58 std::string GetSecond() const; 59 static std::unique_ptr<DateTimeFormat> CreateInstance(const std::vector<std::string> &localeTags, 60 std::map<std::string, std::string> &configs); 61 static icu::UnicodeString GetPatternFromLocale(const std::string& localeTag); 62 static std::unordered_map<std::string, std::string> GetPatternsFromLocale(const std::string& localeTag); 63 static icu::UnicodeString GetYMDPatternFromNumber(const std::string& number); 64 static std::string GetDateSampleFromPattern(const icu::UnicodeString& pattern, const std::string& localeTag); 65 static bool IsValidPatternNumber(const std::string& number); 66 static icu::UnicodeString GetSingleDayPatternFromLocale(const std::string& localeTag); 67 68 private: 69 std::string localeTag; 70 std::string dateStyle; 71 std::string timeStyle; 72 std::string hourCycle; 73 std::string timeZone; 74 std::string numberingSystem; 75 std::string hour12; 76 std::string weekday; 77 std::string era; 78 std::string year; 79 std::string month; 80 std::string day; 81 std::string hour; 82 std::string minute; 83 std::string second; 84 std::string timeZoneName; 85 std::string dayPeriod; 86 std::string localeMatcher; 87 std::string formatMatcher; 88 std::string finalLocale; 89 std::unique_ptr<icu::DateFormat> dateFormat = nullptr; 90 std::unique_ptr<icu::DateIntervalFormat> dateIntvFormat = nullptr; 91 std::unique_ptr<icu::Calendar> calendar = nullptr; 92 std::unique_ptr<LocaleInfo> localeInfo = nullptr; 93 icu::Locale locale; 94 icu::UnicodeString pattern; 95 char16_t yearChar = 'Y'; 96 char16_t monthChar = 'M'; 97 char16_t dayChar = 'd'; 98 char16_t hourChar = 'h'; 99 char16_t minuteChar = 'm'; 100 char16_t secondChar = 's'; 101 char16_t timeZoneChar = 'z'; 102 char16_t weekdayChar = 'E'; 103 char16_t eraChar = 'G'; 104 char16_t amPmChar = 'a'; 105 std::string hourTwoDigitString = "HH"; 106 std::string hourNumericString = "H"; 107 bool createSuccess = false; 108 static const int32_t NUMERIC_LENGTH = 1; 109 static const int32_t TWO_DIGIT_LENGTH = 2; 110 static const int32_t SHORT_LENGTH = 3; 111 static const int32_t LONG_LENGTH = 4; 112 static const int32_t NARROW_LENGTH = 5; 113 static const size_t YEAR_INDEX = 0; 114 static const size_t MONTH_INDEX = 1; 115 static const size_t DAY_INDEX = 2; 116 static const size_t HOUR_INDEX = 3; 117 static const size_t MINUTE_INDEX = 4; 118 static const size_t SECOND_INDEX = 5; 119 static const int32_t SHORT_ERA_LENGTH = 1; 120 static const int32_t LONG_ERA_LENGTH = 4; 121 static const int HALF_HOUR = 30; 122 static const int HOURS_OF_A_DAY = 24; 123 static bool icuInitialized; 124 static const char* DEVICE_TYPE_NAME; 125 static bool Init(); 126 static std::map<std::string, icu::DateFormat::EStyle> dateTimeStyle; 127 enum DefaultStyle { 128 LONG, 129 DEFAULT, 130 SHORT, 131 }; 132 static std::unordered_map<DateTimeFormat::DefaultStyle, icu::DateFormat::EStyle> DefaultDTStyle; 133 static std::unordered_map<std::string, DefaultStyle> DeviceToStyle; 134 DefaultStyle defaultStyle; 135 bool InitWithLocale(const std::string &curLocale, std::map<std::string, std::string> &configs); 136 void ParseConfigsPartOne(std::map<std::string, std::string> &configs); 137 void ParseConfigsPartTwo(std::map<std::string, std::string> &configs); 138 void AddOptions(std::string option, char16_t optionChar); 139 void ComputeSkeleton(); 140 void ComputePattern(); 141 void SetDayPeriod(); 142 static DefaultStyle GetDefaultStyle(); 143 void ComputePartOfPattern(std::string option, char16_t character, std::string twoDigitChar, 144 std::string numericChar); 145 void ComputeHourCycleChars(); 146 void ComputeTimeZoneOfPattern(std::string option, char16_t character, std::string longChar, 147 std::string shortChar); 148 void ComputeWeekdayOfPattern(std::string option, char16_t character, std::string longChar, 149 std::string shortChar, std::string narrowChar); 150 void ComputeEraOfPattern(std::string option, char16_t character, std::string longChar, 151 std::string shortChar, std::string narrowChar); 152 void InitDateFormatWithoutConfigs(UErrorCode &status); 153 void InitDateFormat(UErrorCode &status); 154 void InitDateFormatWithDateTimeStyle(bool& initSuccess, UErrorCode &status); 155 void GetAdditionalResolvedOptions(std::map<std::string, std::string> &map); 156 void FixPatternPartOne(); 157 void FixPatternPartTwo(); 158 void RemoveAmPmChar(); 159 bool CheckInitSuccess(); 160 bool InitPatternByDateStyle(); 161 bool InitPatternByNumeric(); 162 void ReplacePattern(const icu::UnicodeString& tempPattern, const icu::UnicodeString& replacePattern); 163 bool InitFormatter(); 164 static icu::UnicodeString GetBestPattern(const icu::UnicodeString& skeleton, const icu::Locale& icuLocale); 165 static icu::UnicodeString GetBestPattern(icu::DateFormat::EStyle dateStyle, icu::DateFormat::EStyle timeStyle, 166 const icu::Locale& icuLocale); 167 static icu::UnicodeString GetDayPatternFromLocale(const std::string& localeTag); 168 }; 169 } // namespace I18n 170 } // namespace Global 171 } // namespace OHOS 172 #endif