1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_shell.hxx" 26 #include "internal/iso8601_converter.hxx" 27 #include "internal/utilities.hxx" 28 29 #include <sstream> 30 #include <iomanip> 31 32 //----------------------------------- 33 /* Converts ISO 8601 conform date/time 34 represenation to the representation 35 conforming to the current locale 36 */ 37 std::wstring iso8601_date_to_local_date(const std::wstring& isoDate ) 38 { 39 const std::wstring CONST_SPACE(L" "); 40 ::std::wstring ws8601DateTime(isoDate); 41 42 if ( ws8601DateTime.length() == 19 ) 43 { 44 //fill in the SYSTEMTIME structure; 45 std::string asDateTime = WStringToString( ws8601DateTime ); 46 SYSTEMTIME DateTime; 47 DateTime.wYear = ( unsigned short )strtol( asDateTime.substr( 0, 4 ).c_str(), NULL, 10 ); 48 DateTime.wMonth = ( unsigned short )strtol( asDateTime.substr( 5, 2 ).c_str(), NULL, 10 ); 49 DateTime.wDayOfWeek = 0; 50 DateTime.wDay = ( unsigned short )strtol( asDateTime.substr( 8, 2 ).c_str(), NULL, 10 ); 51 DateTime.wHour = ( unsigned short )strtol( asDateTime.substr( 11,2 ).c_str(), NULL, 10 ); 52 DateTime.wMinute = ( unsigned short )strtol( asDateTime.substr( 14,2 ).c_str(), NULL, 10 ); 53 DateTime.wSecond = ( unsigned short )strtol( asDateTime.substr( 17,2 ).c_str(), NULL, 10 ); 54 DateTime.wMilliseconds = 0; 55 56 //get Date info from structure 57 WCHAR DateBuffer[ MAX_PATH ]; 58 int DateSize = GetDateFormatW( 59 LOCALE_SYSTEM_DEFAULT, 60 0, 61 &DateTime, 62 NULL, 63 DateBuffer, 64 MAX_PATH ); 65 66 if ( DateSize ) 67 ws8601DateTime.assign(DateBuffer); 68 else 69 ws8601DateTime = StringToWString( asDateTime ); 70 71 //get Time info from structure 72 WCHAR TimeBuffer[ MAX_PATH ]; 73 74 int TimeSize = GetTimeFormatW( 75 LOCALE_SYSTEM_DEFAULT, 76 0, 77 &DateTime, 78 NULL, 79 TimeBuffer, 80 MAX_PATH ); 81 82 if ( TimeSize ) 83 { 84 ws8601DateTime.append(L" "); 85 ws8601DateTime.append(TimeBuffer); 86 } 87 else 88 ws8601DateTime = StringToWString( asDateTime ); 89 } 90 91 return ws8601DateTime; 92 } 93 94 //------------------------------------ 95 /* Converts ISO 8601 conform duration 96 representation to the representation 97 conforming to the current locale 98 99 Expect format PTnHnMnS according to 100 ISO 8601 where n is abitrary number 101 of digits 102 */ 103 104 std::wstring iso8601_duration_to_local_duration(const std::wstring& iso8601duration) 105 { 106 std::wstring days; 107 std::wstring hours; 108 std::wstring minutes; 109 std::wstring seconds; 110 111 std::wstring::const_iterator iter = iso8601duration.begin(); 112 std::wstring::const_iterator iter_end = iso8601duration.end(); 113 114 std::wstring num; 115 116 for (/**/; iter != iter_end; ++iter) 117 { 118 if (isdigit(*iter)) 119 { 120 num += *iter; 121 } 122 else 123 { 124 if (*iter == L'D' || *iter == L'd') 125 days = num; 126 else if (*iter == L'H' || *iter == L'h') 127 hours = num; 128 else if (*iter == L'M' || *iter == L'm') 129 minutes = num; 130 else if (*iter == L'S' || *iter == L's') 131 seconds = num; 132 133 num.clear(); 134 } 135 } 136 137 if (days.length() > 0) 138 { 139 int h = ((_wtoi(days.c_str()) * 24) + _wtoi(hours.c_str())); 140 wchar_t buff[10]; 141 _itow(h, buff, 10); 142 hours = buff; 143 } 144 145 #if defined(_MSC_VER) //&& defined(_M_X64) 146 std::wostringstream oss; 147 oss << std::setw(2) << std::setfill(wchar_t('0')) << hours << L":" << 148 std::setw(2) << std::setfill(wchar_t('0')) << minutes << L":" << 149 std::setw(2) << std::setfill(wchar_t('0')) << seconds; 150 return oss.str(); 151 #elif defined( __MINGW32__ ) 152 #define ADD_AS_PREFILLED( st, out ) \ 153 if ( st.length() == 0 ) \ 154 out += L"00"; \ 155 else if ( st.length() == 1 ) \ 156 out += L"0"; \ 157 out += st; 158 159 std::wstring result; 160 ADD_AS_PREFILLED( hours, result ) 161 result += L":"; 162 ADD_AS_PREFILLED( minutes, result ) 163 result += L":"; 164 ADD_AS_PREFILLED( seconds, result ) 165 166 return result; 167 #undef ADD_AS_PREFILLED 168 /* 169 #else 170 std::wostringstream oss; 171 oss << std::setw(2) << std::setfill('0') << hours << L":" << 172 std::setw(2) << std::setfill('0') << minutes << L":" << 173 std::setw(2) << std::setfill('0') << seconds; 174 return oss.str(); 175 */ 176 #endif 177 } 178 179