1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "time_util.h"
16 #include <string>
17 #include <stdexcept>
18 #include <sstream>
19 #include <ctime>
20 #include <sys/time.h>
21 #include <chrono>
22 #include "intell_voice_log.h"
23 
24 #define LOG_TAG "TimeUtil"
25 
26 using namespace std;
27 static const int INVALID_TIME_T = -1;
28 
29 namespace OHOS {
30 namespace IntellVoiceUtils {
AutoTimer()31 AutoTimer::AutoTimer()
32 {
33     Reset();
34 }
35 
AutoTimer(const std::string & logInfo)36 AutoTimer::AutoTimer(const std::string &logInfo) : logInfo_(logInfo)
37 {
38     Reset();
39 }
40 
~AutoTimer()41 AutoTimer::~AutoTimer()
42 {
43     if (isReset_) {
44         PrintTimeElapse();
45     }
46 }
47 
PrintTimeElapse()48 void AutoTimer::PrintTimeElapse()
49 {
50     PrintTimeElapse(logInfo_);
51 }
52 
PrintTimeElapse(const std::string & logInfo)53 void AutoTimer::PrintTimeElapse(const std::string &logInfo)
54 {
55     std::string log;
56 
57     try {
58         if (!logInfo.empty()) {
59             log += logInfo + " ";
60         } else {
61             log += logInfo_ + " ";
62         }
63 
64         std::ostringstream ss;
65         ss << TimeElapseMs();
66         log += "time elapse: " + ss.str() + "ms";
67     } catch (const std::length_error& err) {
68         INTELL_VOICE_LOG_ERROR("length error");
69         return;
70     }
71 
72     INTELL_VOICE_LOG_DEBUG("%{public}s", log.c_str());
73 
74     isReset_ = false;
75 }
76 
Reset()77 void AutoTimer::Reset()
78 {
79     TimeUtil::GetTime(timeStart_);
80     isReset_ = true;
81 }
82 
TimeElapseUs()83 long AutoTimer::TimeElapseUs()
84 {
85     isReset_ = false;
86 
87     timespec timeEnd;
88     TimeUtil::GetTime(timeEnd);
89 
90     return TimeUtil::TimeElapseUs(timeStart_, timeEnd);
91 }
92 
TimeElapseMs()93 uint32_t AutoTimer::TimeElapseMs()
94 {
95     return TimeElapseUs() / MS_PER_US;
96 }
97 
TimeElapseS()98 uint32_t AutoTimer::TimeElapseS()
99 {
100     return TimeElapseUs() / (S_PER_MS * MS_PER_US);
101 }
102 
GetCurrTime(TimeFormat format)103 string TimeUtil::GetCurrTime(TimeFormat format)
104 {
105     time_t rawTime;
106     struct tm *timeInfo = nullptr;
107     char buffer[100] = { 0 };
108 
109     time(&rawTime);
110     timeInfo = localtime(&rawTime);
111     if (timeInfo != nullptr) {
112         if (format == TIME_FORMAT_DEFAULT) {
113             strftime(buffer, sizeof(buffer), "%Y_%m_%d_%H_%M_%S_", timeInfo);
114         } else if (format == TIME_FORMAT_CONTINOUS) {
115             strftime(buffer, sizeof(buffer), "%Y%m%d%H%M%S", timeInfo);
116         } else if (format == TIME_FORMAT_STANDARD) {
117             strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", timeInfo);
118         } else {
119             INTELL_VOICE_LOG_WARN("invalid format:%{public}d", format);
120         }
121     }
122     std::string str(buffer);
123 
124     return str;
125 }
126 
GetCurrTimeUs()127 string TimeUtil::GetCurrTimeUs()
128 {
129     struct timeval tv;
130     char buffer[100] = {0};
131     if (gettimeofday(&tv, nullptr) == -1) {
132         INTELL_VOICE_LOG_ERROR("get time of day error");
133         return "";
134     }
135     struct tm *timeInfo = localtime(&tv.tv_sec);
136     if (timeInfo != nullptr) {
137         strftime(buffer, sizeof(buffer), "%Y%m%d%H%M%S", timeInfo);
138     }
139     string str(buffer);
140     stringstream ss;
141     ss << tv.tv_usec;
142     str += ss.str();
143     return str;
144 }
145 
GetFormatTimeToSec(const string & formatTime)146 time_t TimeUtil::GetFormatTimeToSec(const string &formatTime)
147 {
148     INTELL_VOICE_LOG_DEBUG("GetFormatTimeToSec, formatTime is %{public}s", formatTime.c_str());
149     struct tm s_tm;
150 
151     if (!strptime(formatTime.c_str(), "%Y%m%d%H%M%S", &s_tm)) {
152         INTELL_VOICE_LOG_ERROR("get file create time error");
153         return INVALID_TIME_T;
154     }
155 
156     return mktime(&s_tm);
157 }
158 
IsFormatTimeExpired(const string & formatTime,int maxKeepTime)159 bool TimeUtil::IsFormatTimeExpired(const string &formatTime, int maxKeepTime)
160 {
161     time_t currentTime;
162     time_t originalTime;
163 
164     currentTime = time(nullptr);
165     originalTime = GetFormatTimeToSec(formatTime);
166     if ((originalTime == INVALID_TIME_T) || (currentTime == INVALID_TIME_T)) {
167         INTELL_VOICE_LOG_ERROR("get sys time error");
168         return false;
169     }
170 
171     return (currentTime >= originalTime) && (currentTime - originalTime >= maxKeepTime);
172 }
173 
GetCurrentTimeMs()174 uint64_t TimeUtil::GetCurrentTimeMs()
175 {
176     return static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::milliseconds>(
177         std::chrono::system_clock::now().time_since_epoch()).count());
178 }
179 }
180 }
181