Resolves: tdf#143008 Evaluate AM/PM for type date+time text-to-column and CSV
Change-Id: Ib760b9a103ab4b8ce7f5a158b09fbe11c6617f2a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117747
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins
(cherry picked from commit d81775f5b12080676ebaf659c5a4c10d64a9074b)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117719
diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx
index b1a553a..380bd87 100644
--- a/sc/source/ui/docshell/impex.cxx
+++ b/sc/source/ui/docshell/impex.cxx
@@ -1068,7 +1068,7 @@ static bool lcl_PutString(
else if ( nColFormat != SC_COL_STANDARD ) // Datumformats
{
const sal_uInt16 nMaxNumberParts = 7; // Y-M-D h:m:s.t
sal_Int32 nLen = rStr.getLength();
const sal_Int32 nLen = rStr.getLength();
sal_Int32 nStart[nMaxNumberParts];
sal_Int32 nEnd[nMaxNumberParts];
@@ -1225,6 +1225,36 @@ static bool lcl_PutString(
if (eStatus == rtl_math_ConversionStatus_Ok)
fFrac = fV / 86400.0;
}
sal_Int32 nPos;
if (nFound > 3 && 1 <= nHour && nHour <= 12 // nHour 0 and >=13 can't be AM/PM
&& (nPos = nEnd[nFound-1] + 1) < nLen)
{
// Dreaded AM/PM may be following.
while (nPos < nLen && rStr[nPos] == ' ')
++nPos;
if (nPos < nLen)
{
sal_Int32 nStop = nPos;
while (nStop < nLen && rStr[nStop] != ' ')
++nStop;
OUString aAmPm = rStr.copy( nPos, nStop - nPos);
// For AM only 12 needs to be treated, whereas for PM
// it must not. Check both, locale and second/English
// strings.
if (nHour == 12 &&
(rTransliteration.isEqual( aAmPm, pFormatter->GetLocaleData()->getTimeAM()) ||
(pSecondTransliteration && pSecondTransliteration->isEqual( aAmPm, "AM"))))
{
nHour = 0;
}
else if (nHour < 12 &&
(rTransliteration.isEqual( aAmPm, pFormatter->GetLocaleData()->getTimePM()) ||
(pSecondTransliteration && pSecondTransliteration->isEqual( aAmPm, "PM"))))
{
nHour += 12;
}
}
}
pCalendar->setValue( i18n::CalendarFieldIndex::HOUR, nHour );
pCalendar->setValue( i18n::CalendarFieldIndex::MINUTE, nMinute );
pCalendar->setValue( i18n::CalendarFieldIndex::SECOND, nSecond );