15490a39dSopenharmony_ci/* 25490a39dSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 35490a39dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 45490a39dSopenharmony_ci * you may not use this file except in compliance with the License. 55490a39dSopenharmony_ci * You may obtain a copy of the License at 65490a39dSopenharmony_ci * 75490a39dSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 85490a39dSopenharmony_ci * 95490a39dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 105490a39dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 115490a39dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 125490a39dSopenharmony_ci * See the License for the specific language governing permissions and 135490a39dSopenharmony_ci * limitations under the License. 145490a39dSopenharmony_ci */ 155490a39dSopenharmony_ci#include "time_util.h" 165490a39dSopenharmony_ci#include <string> 175490a39dSopenharmony_ci#include <stdexcept> 185490a39dSopenharmony_ci#include <sstream> 195490a39dSopenharmony_ci#include <ctime> 205490a39dSopenharmony_ci#include <sys/time.h> 215490a39dSopenharmony_ci#include <chrono> 225490a39dSopenharmony_ci#include "intell_voice_log.h" 235490a39dSopenharmony_ci 245490a39dSopenharmony_ci#define LOG_TAG "TimeUtil" 255490a39dSopenharmony_ci 265490a39dSopenharmony_ciusing namespace std; 275490a39dSopenharmony_cistatic const int INVALID_TIME_T = -1; 285490a39dSopenharmony_ci 295490a39dSopenharmony_cinamespace OHOS { 305490a39dSopenharmony_cinamespace IntellVoiceUtils { 315490a39dSopenharmony_ciAutoTimer::AutoTimer() 325490a39dSopenharmony_ci{ 335490a39dSopenharmony_ci Reset(); 345490a39dSopenharmony_ci} 355490a39dSopenharmony_ci 365490a39dSopenharmony_ciAutoTimer::AutoTimer(const std::string &logInfo) : logInfo_(logInfo) 375490a39dSopenharmony_ci{ 385490a39dSopenharmony_ci Reset(); 395490a39dSopenharmony_ci} 405490a39dSopenharmony_ci 415490a39dSopenharmony_ciAutoTimer::~AutoTimer() 425490a39dSopenharmony_ci{ 435490a39dSopenharmony_ci if (isReset_) { 445490a39dSopenharmony_ci PrintTimeElapse(); 455490a39dSopenharmony_ci } 465490a39dSopenharmony_ci} 475490a39dSopenharmony_ci 485490a39dSopenharmony_civoid AutoTimer::PrintTimeElapse() 495490a39dSopenharmony_ci{ 505490a39dSopenharmony_ci PrintTimeElapse(logInfo_); 515490a39dSopenharmony_ci} 525490a39dSopenharmony_ci 535490a39dSopenharmony_civoid AutoTimer::PrintTimeElapse(const std::string &logInfo) 545490a39dSopenharmony_ci{ 555490a39dSopenharmony_ci std::string log; 565490a39dSopenharmony_ci 575490a39dSopenharmony_ci try { 585490a39dSopenharmony_ci if (!logInfo.empty()) { 595490a39dSopenharmony_ci log += logInfo + " "; 605490a39dSopenharmony_ci } else { 615490a39dSopenharmony_ci log += logInfo_ + " "; 625490a39dSopenharmony_ci } 635490a39dSopenharmony_ci 645490a39dSopenharmony_ci std::ostringstream ss; 655490a39dSopenharmony_ci ss << TimeElapseMs(); 665490a39dSopenharmony_ci log += "time elapse: " + ss.str() + "ms"; 675490a39dSopenharmony_ci } catch (const std::length_error& err) { 685490a39dSopenharmony_ci INTELL_VOICE_LOG_ERROR("length error"); 695490a39dSopenharmony_ci return; 705490a39dSopenharmony_ci } 715490a39dSopenharmony_ci 725490a39dSopenharmony_ci INTELL_VOICE_LOG_DEBUG("%{public}s", log.c_str()); 735490a39dSopenharmony_ci 745490a39dSopenharmony_ci isReset_ = false; 755490a39dSopenharmony_ci} 765490a39dSopenharmony_ci 775490a39dSopenharmony_civoid AutoTimer::Reset() 785490a39dSopenharmony_ci{ 795490a39dSopenharmony_ci TimeUtil::GetTime(timeStart_); 805490a39dSopenharmony_ci isReset_ = true; 815490a39dSopenharmony_ci} 825490a39dSopenharmony_ci 835490a39dSopenharmony_cilong AutoTimer::TimeElapseUs() 845490a39dSopenharmony_ci{ 855490a39dSopenharmony_ci isReset_ = false; 865490a39dSopenharmony_ci 875490a39dSopenharmony_ci timespec timeEnd; 885490a39dSopenharmony_ci TimeUtil::GetTime(timeEnd); 895490a39dSopenharmony_ci 905490a39dSopenharmony_ci return TimeUtil::TimeElapseUs(timeStart_, timeEnd); 915490a39dSopenharmony_ci} 925490a39dSopenharmony_ci 935490a39dSopenharmony_ciuint32_t AutoTimer::TimeElapseMs() 945490a39dSopenharmony_ci{ 955490a39dSopenharmony_ci return TimeElapseUs() / MS_PER_US; 965490a39dSopenharmony_ci} 975490a39dSopenharmony_ci 985490a39dSopenharmony_ciuint32_t AutoTimer::TimeElapseS() 995490a39dSopenharmony_ci{ 1005490a39dSopenharmony_ci return TimeElapseUs() / (S_PER_MS * MS_PER_US); 1015490a39dSopenharmony_ci} 1025490a39dSopenharmony_ci 1035490a39dSopenharmony_cistring TimeUtil::GetCurrTime(TimeFormat format) 1045490a39dSopenharmony_ci{ 1055490a39dSopenharmony_ci time_t rawTime; 1065490a39dSopenharmony_ci struct tm *timeInfo = nullptr; 1075490a39dSopenharmony_ci char buffer[100] = { 0 }; 1085490a39dSopenharmony_ci 1095490a39dSopenharmony_ci time(&rawTime); 1105490a39dSopenharmony_ci timeInfo = localtime(&rawTime); 1115490a39dSopenharmony_ci if (timeInfo != nullptr) { 1125490a39dSopenharmony_ci if (format == TIME_FORMAT_DEFAULT) { 1135490a39dSopenharmony_ci strftime(buffer, sizeof(buffer), "%Y_%m_%d_%H_%M_%S_", timeInfo); 1145490a39dSopenharmony_ci } else if (format == TIME_FORMAT_CONTINOUS) { 1155490a39dSopenharmony_ci strftime(buffer, sizeof(buffer), "%Y%m%d%H%M%S", timeInfo); 1165490a39dSopenharmony_ci } else if (format == TIME_FORMAT_STANDARD) { 1175490a39dSopenharmony_ci strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", timeInfo); 1185490a39dSopenharmony_ci } else { 1195490a39dSopenharmony_ci INTELL_VOICE_LOG_WARN("invalid format:%{public}d", format); 1205490a39dSopenharmony_ci } 1215490a39dSopenharmony_ci } 1225490a39dSopenharmony_ci std::string str(buffer); 1235490a39dSopenharmony_ci 1245490a39dSopenharmony_ci return str; 1255490a39dSopenharmony_ci} 1265490a39dSopenharmony_ci 1275490a39dSopenharmony_cistring TimeUtil::GetCurrTimeUs() 1285490a39dSopenharmony_ci{ 1295490a39dSopenharmony_ci struct timeval tv; 1305490a39dSopenharmony_ci char buffer[100] = {0}; 1315490a39dSopenharmony_ci if (gettimeofday(&tv, nullptr) == -1) { 1325490a39dSopenharmony_ci INTELL_VOICE_LOG_ERROR("get time of day error"); 1335490a39dSopenharmony_ci return ""; 1345490a39dSopenharmony_ci } 1355490a39dSopenharmony_ci struct tm *timeInfo = localtime(&tv.tv_sec); 1365490a39dSopenharmony_ci if (timeInfo != nullptr) { 1375490a39dSopenharmony_ci strftime(buffer, sizeof(buffer), "%Y%m%d%H%M%S", timeInfo); 1385490a39dSopenharmony_ci } 1395490a39dSopenharmony_ci string str(buffer); 1405490a39dSopenharmony_ci stringstream ss; 1415490a39dSopenharmony_ci ss << tv.tv_usec; 1425490a39dSopenharmony_ci str += ss.str(); 1435490a39dSopenharmony_ci return str; 1445490a39dSopenharmony_ci} 1455490a39dSopenharmony_ci 1465490a39dSopenharmony_citime_t TimeUtil::GetFormatTimeToSec(const string &formatTime) 1475490a39dSopenharmony_ci{ 1485490a39dSopenharmony_ci INTELL_VOICE_LOG_DEBUG("GetFormatTimeToSec, formatTime is %{public}s", formatTime.c_str()); 1495490a39dSopenharmony_ci struct tm s_tm; 1505490a39dSopenharmony_ci 1515490a39dSopenharmony_ci if (!strptime(formatTime.c_str(), "%Y%m%d%H%M%S", &s_tm)) { 1525490a39dSopenharmony_ci INTELL_VOICE_LOG_ERROR("get file create time error"); 1535490a39dSopenharmony_ci return INVALID_TIME_T; 1545490a39dSopenharmony_ci } 1555490a39dSopenharmony_ci 1565490a39dSopenharmony_ci return mktime(&s_tm); 1575490a39dSopenharmony_ci} 1585490a39dSopenharmony_ci 1595490a39dSopenharmony_cibool TimeUtil::IsFormatTimeExpired(const string &formatTime, int maxKeepTime) 1605490a39dSopenharmony_ci{ 1615490a39dSopenharmony_ci time_t currentTime; 1625490a39dSopenharmony_ci time_t originalTime; 1635490a39dSopenharmony_ci 1645490a39dSopenharmony_ci currentTime = time(nullptr); 1655490a39dSopenharmony_ci originalTime = GetFormatTimeToSec(formatTime); 1665490a39dSopenharmony_ci if ((originalTime == INVALID_TIME_T) || (currentTime == INVALID_TIME_T)) { 1675490a39dSopenharmony_ci INTELL_VOICE_LOG_ERROR("get sys time error"); 1685490a39dSopenharmony_ci return false; 1695490a39dSopenharmony_ci } 1705490a39dSopenharmony_ci 1715490a39dSopenharmony_ci return (currentTime >= originalTime) && (currentTime - originalTime >= maxKeepTime); 1725490a39dSopenharmony_ci} 1735490a39dSopenharmony_ci 1745490a39dSopenharmony_ciuint64_t TimeUtil::GetCurrentTimeMs() 1755490a39dSopenharmony_ci{ 1765490a39dSopenharmony_ci return static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::milliseconds>( 1775490a39dSopenharmony_ci std::chrono::system_clock::now().time_since_epoch()).count()); 1785490a39dSopenharmony_ci} 1795490a39dSopenharmony_ci} 1805490a39dSopenharmony_ci} 181