未验证 提交 5b6f0275 编写于 作者: O openharmony_ci 提交者: Gitee

!157 fix datetimefmt bug

Merge pull request !157 from sunyaozu/master
...@@ -129,7 +129,9 @@ private: ...@@ -129,7 +129,9 @@ private:
void InitDateFormatWithoutConfigs(UErrorCode &status); void InitDateFormatWithoutConfigs(UErrorCode &status);
void InitDateFormat(UErrorCode &status); void InitDateFormat(UErrorCode &status);
void GetAdditionalResolvedOptions(std::map<std::string, std::string> &map); void GetAdditionalResolvedOptions(std::map<std::string, std::string> &map);
void FixPattern(); void FixPatternPartOne();
void FixPatternPartTwo();
void removeAmPmChar();
}; };
} // namespace I18n } // namespace I18n
} // namespace Global } // namespace Global
......
...@@ -112,52 +112,95 @@ void DateTimeFormat::InitDateFormatWithoutConfigs(UErrorCode &status) ...@@ -112,52 +112,95 @@ void DateTimeFormat::InitDateFormatWithoutConfigs(UErrorCode &status)
dateIntvFormat = DateIntervalFormat::createInstance(pattern, locale, status); dateIntvFormat = DateIntervalFormat::createInstance(pattern, locale, status);
} }
void DateTimeFormat::FixPattern() void DateTimeFormat::FixPatternPartOne()
{ {
if (hour12 == "true") { if (hour12 == "true") {
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("H")), pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("H")),
icu::UnicodeString::fromUTF8(StringPiece("h"))); icu::UnicodeString::fromUTF8(StringPiece("h")));
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("k")), pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("k")),
icu::UnicodeString::fromUTF8(StringPiece("h"))); icu::UnicodeString::fromUTF8(StringPiece("h")));
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("K")), pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("K")),
icu::UnicodeString::fromUTF8(StringPiece("h"))); icu::UnicodeString::fromUTF8(StringPiece("h")));
} else if (hour12 == "false") { } else if (hour12 == "false") {
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("h")), pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("h")),
icu::UnicodeString::fromUTF8(StringPiece("H"))); icu::UnicodeString::fromUTF8(StringPiece("H")));
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("k")), pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("k")),
icu::UnicodeString::fromUTF8(StringPiece("H"))); icu::UnicodeString::fromUTF8(StringPiece("H")));
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("K")), pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("K")),
icu::UnicodeString::fromUTF8(StringPiece("H"))); icu::UnicodeString::fromUTF8(StringPiece("H")));
removeAmPmChar();
} else if (hourCycle != "") { } else if (hourCycle != "") {
if (hourCycle == "h11") { FixPatternPartTwo();
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("h")), }
icu::UnicodeString::fromUTF8(StringPiece("K"))); }
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("H")),
icu::UnicodeString::fromUTF8(StringPiece("K"))); void DateTimeFormat::FixPatternPartTwo()
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("k")), {
icu::UnicodeString::fromUTF8(StringPiece("K"))); if (hourCycle == "h11") {
} else if (hourCycle == "h12") { pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("h")),
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("H")), icu::UnicodeString::fromUTF8(StringPiece("k")));
icu::UnicodeString::fromUTF8(StringPiece("h"))); pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("H")),
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("k")), icu::UnicodeString::fromUTF8(StringPiece("k")));
icu::UnicodeString::fromUTF8(StringPiece("h"))); pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("K")),
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("K")), icu::UnicodeString::fromUTF8(StringPiece("k")));
icu::UnicodeString::fromUTF8(StringPiece("h"))); } else if (hourCycle == "h12") {
} else if (hourCycle == "h23") { pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("H")),
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("h")), icu::UnicodeString::fromUTF8(StringPiece("h")));
icu::UnicodeString::fromUTF8(StringPiece("H"))); pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("k")),
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("k")), icu::UnicodeString::fromUTF8(StringPiece("h")));
icu::UnicodeString::fromUTF8(StringPiece("H"))); pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("K")),
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("K")), icu::UnicodeString::fromUTF8(StringPiece("h")));
icu::UnicodeString::fromUTF8(StringPiece("H"))); } else if (hourCycle == "h23") {
} else if (hourCycle == "h24") { pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("h")),
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("h")), icu::UnicodeString::fromUTF8(StringPiece("K")));
icu::UnicodeString::fromUTF8(StringPiece("k"))); pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("H")),
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("H")), icu::UnicodeString::fromUTF8(StringPiece("K")));
icu::UnicodeString::fromUTF8(StringPiece("k"))); pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("k")),
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("K")), icu::UnicodeString::fromUTF8(StringPiece("K")));
icu::UnicodeString::fromUTF8(StringPiece("k"))); removeAmPmChar();
} else if (hourCycle == "h24") {
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("h")),
icu::UnicodeString::fromUTF8(StringPiece("H")));
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("k")),
icu::UnicodeString::fromUTF8(StringPiece("H")));
pattern.findAndReplace(icu::UnicodeString::fromUTF8(StringPiece("K")),
icu::UnicodeString::fromUTF8(StringPiece("H")));
removeAmPmChar();
}
}
void DateTimeFormat::removeAmPmChar()
{
std::string patternString = "";
pattern.toUTF8String(patternString);
size_t amPmCharStartIdx = -1;
size_t amPmCharEndIdx = -1;
for (size_t i = 0; i < patternString.length(); i++) {
if (patternString[i] != 'a') {
continue;
}
if ((i + 1) < patternString.length() && patternString[i+1] == 't') {
continue;
}
amPmCharStartIdx = i - 1;
while (amPmCharStartIdx >= 0 && patternString[amPmCharStartIdx] == ' ') {
amPmCharStartIdx -= 1;
}
amPmCharStartIdx += 1;
amPmCharEndIdx = i + 1;
while (amPmCharEndIdx < patternString.length() && patternString[amPmCharEndIdx] == ' ') {
amPmCharEndIdx += 1;
} }
break;
}
size_t length = amPmCharEndIdx - amPmCharStartIdx;
if (length != 0) {
if (amPmCharStartIdx == 0 || amPmCharEndIdx == patternString.length()) {
patternString = patternString.replace(amPmCharStartIdx, length, "");
} else {
patternString = patternString.replace(amPmCharStartIdx, length, " ");
}
pattern = icu::UnicodeString(patternString.data(), patternString.length());
} }
} }
...@@ -177,13 +220,8 @@ void DateTimeFormat::InitDateFormat(UErrorCode &status) ...@@ -177,13 +220,8 @@ void DateTimeFormat::InitDateFormat(UErrorCode &status)
if (simDateFormat != nullptr) { if (simDateFormat != nullptr) {
simDateFormat->toPattern(pattern); simDateFormat->toPattern(pattern);
} }
FixPattern(); FixPatternPartOne();
delete dateFormat; delete dateFormat;
auto patternGenerator =
std::unique_ptr<DateTimePatternGenerator>(DateTimePatternGenerator::createInstance(locale, status));
pattern =
patternGenerator->replaceFieldTypes(patternGenerator->getBestPattern(pattern, status), pattern, status);
pattern = patternGenerator->getBestPattern(pattern, status);
dateFormat = new SimpleDateFormat(pattern, locale, status); dateFormat = new SimpleDateFormat(pattern, locale, status);
} else { } else {
auto patternGenerator = auto patternGenerator =
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册