blob: 2c4b68ac3856ad0899af6dfcb71bf9affab84733 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_shell.hxx"
#include "internal/iso8601_converter.hxx"
#include "internal/utilities.hxx"
#include <sstream>
#include <iomanip>
//-----------------------------------
/* Converts ISO 8601 conform date/time
represenation to the representation
conforming to the current locale
*/
std::wstring iso8601_date_to_local_date(const std::wstring& isoDate )
{
const std::wstring CONST_SPACE(L" ");
::std::wstring ws8601DateTime(isoDate);
if ( ws8601DateTime.length() == 19 )
{
//fill in the SYSTEMTIME structure;
std::string asDateTime = WStringToString( ws8601DateTime );
SYSTEMTIME DateTime;
DateTime.wYear = ( unsigned short )strtol( asDateTime.substr( 0, 4 ).c_str(), NULL, 10 );
DateTime.wMonth = ( unsigned short )strtol( asDateTime.substr( 5, 2 ).c_str(), NULL, 10 );
DateTime.wDayOfWeek = 0;
DateTime.wDay = ( unsigned short )strtol( asDateTime.substr( 8, 2 ).c_str(), NULL, 10 );
DateTime.wHour = ( unsigned short )strtol( asDateTime.substr( 11,2 ).c_str(), NULL, 10 );
DateTime.wMinute = ( unsigned short )strtol( asDateTime.substr( 14,2 ).c_str(), NULL, 10 );
DateTime.wSecond = ( unsigned short )strtol( asDateTime.substr( 17,2 ).c_str(), NULL, 10 );
DateTime.wMilliseconds = 0;
//get Date info from structure
WCHAR DateBuffer[ MAX_PATH ];
int DateSize = GetDateFormatW(
LOCALE_SYSTEM_DEFAULT,
0,
&DateTime,
NULL,
DateBuffer,
MAX_PATH );
if ( DateSize )
ws8601DateTime.assign(DateBuffer);
else
ws8601DateTime = StringToWString( asDateTime );
//get Time info from structure
WCHAR TimeBuffer[ MAX_PATH ];
int TimeSize = GetTimeFormatW(
LOCALE_SYSTEM_DEFAULT,
0,
&DateTime,
NULL,
TimeBuffer,
MAX_PATH );
if ( TimeSize )
{
ws8601DateTime.append(L" ");
ws8601DateTime.append(TimeBuffer);
}
else
ws8601DateTime = StringToWString( asDateTime );
}
return ws8601DateTime;
}
//------------------------------------
/* Converts ISO 8601 conform duration
representation to the representation
conforming to the current locale
Expect format PTnHnMnS according to
ISO 8601 where n is abitrary number
of digits
*/
std::wstring iso8601_duration_to_local_duration(const std::wstring& iso8601duration)
{
std::wstring days;
std::wstring hours;
std::wstring minutes;
std::wstring seconds;
std::wstring::const_iterator iter = iso8601duration.begin();
std::wstring::const_iterator iter_end = iso8601duration.end();
std::wstring num;
for (/**/; iter != iter_end; ++iter)
{
if (isdigit(*iter))
{
num += *iter;
}
else
{
if (*iter == L'D' || *iter == L'd')
days = num;
else if (*iter == L'H' || *iter == L'h')
hours = num;
else if (*iter == L'M' || *iter == L'm')
minutes = num;
else if (*iter == L'S' || *iter == L's')
seconds = num;
num.clear();
}
}
if (days.length() > 0)
{
int h = ((_wtoi(days.c_str()) * 24) + _wtoi(hours.c_str()));
wchar_t buff[10];
_itow(h, buff, 10);
hours = buff;
}
#if defined(_MSC_VER) //&& defined(_M_X64)
std::wostringstream oss;
oss << std::setw(2) << std::setfill(wchar_t('0')) << hours << L":" <<
std::setw(2) << std::setfill(wchar_t('0')) << minutes << L":" <<
std::setw(2) << std::setfill(wchar_t('0')) << seconds;
return oss.str();
#elif defined( __MINGW32__ )
#define ADD_AS_PREFILLED( st, out ) \
if ( st.length() == 0 ) \
out += L"00"; \
else if ( st.length() == 1 ) \
out += L"0"; \
out += st;
std::wstring result;
ADD_AS_PREFILLED( hours, result )
result += L":";
ADD_AS_PREFILLED( minutes, result )
result += L":";
ADD_AS_PREFILLED( seconds, result )
return result;
#undef ADD_AS_PREFILLED
/*
#else
std::wostringstream oss;
oss << std::setw(2) << std::setfill('0') << hours << L":" <<
std::setw(2) << std::setfill('0') << minutes << L":" <<
std::setw(2) << std::setfill('0') << seconds;
return oss.str();
*/
#endif
}