17405867cSopenharmony_ci/*
27405867cSopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
37405867cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
47405867cSopenharmony_ci * you may not use this file except in compliance with the License.
57405867cSopenharmony_ci * You may obtain a copy of the License at
67405867cSopenharmony_ci *
77405867cSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
87405867cSopenharmony_ci *
97405867cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
107405867cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
117405867cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127405867cSopenharmony_ci * See the License for the specific language governing permissions and
137405867cSopenharmony_ci * limitations under the License.
147405867cSopenharmony_ci */
157405867cSopenharmony_ci#include "time_util.h"
167405867cSopenharmony_ci
177405867cSopenharmony_ci#include <chrono>
187405867cSopenharmony_ci#include <ctime>
197405867cSopenharmony_ci#include <sys/time.h>
207405867cSopenharmony_ci
217405867cSopenharmony_cinamespace OHOS {
227405867cSopenharmony_cinamespace HiviewDFX {
237405867cSopenharmony_cinamespace TimeUtil {
247405867cSopenharmony_cinamespace {
257405867cSopenharmony_ciconst std::string DEFAULT_DATE = "19700101";
267405867cSopenharmony_ci}
277405867cSopenharmony_ciuint64_t GetMilliseconds()
287405867cSopenharmony_ci{
297405867cSopenharmony_ci    auto now = std::chrono::system_clock::now();
307405867cSopenharmony_ci    auto millisecs = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
317405867cSopenharmony_ci    return millisecs.count();
327405867cSopenharmony_ci}
337405867cSopenharmony_ci
347405867cSopenharmony_cistd::string GetDate()
357405867cSopenharmony_ci{
367405867cSopenharmony_ci    time_t nowTime = time(nullptr);
377405867cSopenharmony_ci    if (nowTime < 0) {
387405867cSopenharmony_ci        return DEFAULT_DATE;
397405867cSopenharmony_ci    }
407405867cSopenharmony_ci    char dateChs[9] = { 0 }; // 9 means 8(19700101) + 1('\0')
417405867cSopenharmony_ci    struct tm localTm;
427405867cSopenharmony_ci    if (localtime_r(&nowTime, &localTm) == nullptr) {
437405867cSopenharmony_ci        return DEFAULT_DATE;
447405867cSopenharmony_ci    }
457405867cSopenharmony_ci    if (strftime(dateChs, sizeof(dateChs), "%Y%m%d", &localTm) == 0) {
467405867cSopenharmony_ci        return DEFAULT_DATE;
477405867cSopenharmony_ci    }
487405867cSopenharmony_ci    return dateChs;
497405867cSopenharmony_ci}
507405867cSopenharmony_ci
517405867cSopenharmony_cistd::string GetTimeZone()
527405867cSopenharmony_ci{
537405867cSopenharmony_ci    struct timeval tv;
547405867cSopenharmony_ci    if (gettimeofday(&tv, nullptr) != 0) {
557405867cSopenharmony_ci        return "";
567405867cSopenharmony_ci    }
577405867cSopenharmony_ci    time_t sysSec = tv.tv_sec;
587405867cSopenharmony_ci    struct tm tmLocal;
597405867cSopenharmony_ci    if (localtime_r(&sysSec, &tmLocal) == nullptr) {
607405867cSopenharmony_ci        return "";
617405867cSopenharmony_ci    }
627405867cSopenharmony_ci    constexpr size_t buffSize = 6; // for '+0800\0'
637405867cSopenharmony_ci    char buff[buffSize] = {0};
647405867cSopenharmony_ci    if (strftime(buff, buffSize, "%z", &tmLocal) == 0) {
657405867cSopenharmony_ci        return "";
667405867cSopenharmony_ci    }
677405867cSopenharmony_ci    return std::string(buff);
687405867cSopenharmony_ci}
697405867cSopenharmony_ci} // namespace TimeUtil
707405867cSopenharmony_ci} // namespace HiviewDFX
717405867cSopenharmony_ci} // namespace OHOS
72