Skip to content

Commit

Permalink
setlenient=true, get LC_TIME locale
Browse files Browse the repository at this point in the history
  • Loading branch information
christopherlam committed Sep 11, 2024
1 parent 6e84b13 commit 47e10e5
Showing 1 changed file with 25 additions and 7 deletions.
32 changes: 25 additions & 7 deletions libgnucash/engine/gnc-datetime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -616,26 +616,44 @@ GncDateTimeImpl::timestamp()
return str.substr(0, 8) + str.substr(9, 15);
}

static icu::Locale
get_LCTIME_locale()
{
const char* lc_time_locale = setlocale(LC_TIME, nullptr);

if (lc_time_locale == nullptr)
return icu::Locale::getDefault();

std::string localeStr(lc_time_locale);
size_t dotPos = localeStr.find('.');
if (dotPos != std::string::npos)
localeStr = localeStr.substr(0, dotPos);

return icu::Locale::createCanonical (localeStr.c_str());
}

static Date
use_icu_parser (const std::string str)
{
UErrorCode status = U_ZERO_ERROR;
icu::Locale locale;
std::unique_ptr<icu::DateFormat> formatter(icu::DateFormat::createDateInstance(icu::DateFormat::kDefault, locale));
icu::Locale locale = get_LCTIME_locale();

static std::unique_ptr<icu::DateFormat> formatter(icu::DateFormat::createDateInstance(icu::DateFormat::kDefault, locale));
if (formatter == nullptr)
throw std::invalid_argument ("Cannot create date formatter.");

static std::unique_ptr<icu::Calendar> calendar(icu::Calendar::createInstance(locale, status));
if (U_FAILURE(status))
throw std::invalid_argument("Cannot create calendar instance.");
calendar->setLenient (false);

icu::UnicodeString input = icu::UnicodeString::fromUTF8(str);
icu::ParsePosition parsePos;

UDate date = formatter->parse(input, parsePos);
if (parsePos.getErrorIndex() != -1)
if (parsePos.getErrorIndex() != -1 || parsePos.getIndex() != input.length())
throw std::invalid_argument ("Cannot parse string");

std::unique_ptr<icu::Calendar> calendar(icu::Calendar::createInstance(locale, status));
if (U_FAILURE(status))
throw std::invalid_argument("Cannot create calendar instance.");

calendar->setTime(date, status);
if (U_FAILURE(status))
throw std::invalid_argument ("Cannot set calendar time");
Expand Down

0 comments on commit 47e10e5

Please sign in to comment.