CTimeUtils.h
#pragma once
#include <string>
#include <stdint.h>
#ifdef _UNICODE
using _tstring = std::wstring;
#else
using _tstring = std::string;
#endif
//1 秒 second = 1000 毫秒 millisecond
//1 毫秒 millisecond = 1000 微妙 microsecond
//1 微妙 microsecond = 1000 纳秒 nanosecond
class CTimeUtils
{
public:
//
// @brief: 获取当前时间戳
// @param: void
// @ret: 时间戳(单位: 毫秒) 如: 1697017380617
static int64_t GetCurrentTimestamp();
//
// @brief: 获取当前日期字符串
// @param: void
// @ret: 时间戳字符串 如: 2023-10-11
static _tstring GetCurrentDateString();
//
// @brief: 获取当前时间戳字符串
// @param: bHasDate 是否包含日期
// @ret: 时间戳字符串 如:
// 包含日期: 2023-10-11 17:43:00.617
// 不包含日期: 17:43:00.617
static _tstring GetCurrentTimeString(bool bHasDate = true);
//
// @brief: 时间戳转字符串
// @param: timestamp 时间戳 如: 1697017380617
// @param: bHasDate 是否包含日期
// @ret: 时间字符串 如: 2023-10-11 17:43:00.617
static _tstring TimestampToString(int64_t timestamp, bool bHasDate = true);
//
// @brief: 字符串转时间戳
// @param: timeString 时间字符串, 如: 2023-10-11 17:43:00.617
// @ret: 时间戳(单位: 毫秒) 如: 1697017380617
static int64_t StringToTimestamp(const _tstring& timeString);
//
// @brief: 获取系统启动以来经过的毫秒数
// @param: void
// @ret: 毫秒数
static uint64_t GetCurrentTickCount();
};
CTimeUtils.cpp
#include "CTimeUtils.h"
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
int64_t CTimeUtils::GetCurrentTimestamp()
{
int64_t timeStamp = 0;
(void)::GetSystemTimeAsFileTime((FILETIME*)&timeStamp);
return (timeStamp - 116444736000000000) / 10000;
}
_tstring CTimeUtils::GetCurrentDateString()
{
TCHAR szBuf[MAX_PATH] = { 0 };
SYSTEMTIME st = { 0 };
(void)::GetLocalTime(&st);
::StringCchPrintf(szBuf, _countof(szBuf),
_T("%04d-%02d-%02d"),
st.wYear, st.wMonth, st.wDay
);
return szBuf;
}
_tstring CTimeUtils::GetCurrentTimeString(bool bHasDate/* = true*/)
{
TCHAR szBuf[MAX_PATH] = { 0 };
SYSTEMTIME st = { 0 };
(void)::GetLocalTime(&st);
if (bHasDate)
{
::StringCchPrintf(szBuf, _countof(szBuf),
_T("%04d-%02d-%02d %02d:%02d:%02d.%d"),
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds
);
}
else
{
::StringCchPrintf(szBuf, _countof(szBuf),
_T("%02d:%02d:%02d.%d"), st.wHour, st.wMinute, st.wSecond, st.wMilliseconds
);
}
return szBuf;
}
_tstring CTimeUtils::TimestampToString(int64_t timestamp, bool bHasDate/* = true*/)
{
TCHAR szBuf[MAX_PATH] = { 0 };
SYSTEMTIME st = { 0 };
FILETIME ftFile = { 0 };
FILETIME ftLocal = { 0 };
timestamp = timestamp * 10000 + 116444736000000000;
ftFile.dwLowDateTime = timestamp & 0xFFFFFFFF;
ftFile.dwHighDateTime = timestamp >> 32;
::FileTimeToLocalFileTime(&ftFile, &ftLocal);
::FileTimeToSystemTime(&ftLocal, &st);
if (bHasDate)
{
::StringCchPrintf(szBuf, _countof(szBuf),
_T("%04d-%02d-%02d %02d:%02d:%02d.%d"),
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds
);
}
else
{
::StringCchPrintf(szBuf, _countof(szBuf),
_T("%02d:%02d:%02d.%d"), st.wHour, st.wMinute, st.wSecond, st.wMilliseconds
);
}
return szBuf;
}
int64_t CTimeUtils::StringToTimestamp(const _tstring& timeString)
{
FILETIME ftFile = { 0 };
FILETIME ftLocal = { 0 };
SYSTEMTIME st = { 0 };
::_stscanf_s(timeString.c_str(), _T("%hd-%hd-%hd %hd:%hd:%hd.%hd"),
&st.wYear,
&st.wMonth,
&st.wDay,
&st.wHour,
&st.wMinute,
&st.wSecond,
&st.wMilliseconds
);
::SystemTimeToFileTime(&st, &ftLocal);
::LocalFileTimeToFileTime(&ftLocal, &ftFile);
int64_t timeStamp = ((int64_t)ftFile.dwHighDateTime << 32) | ftFile.dwLowDateTime;
return (timeStamp - 116444736000000000) / 10000;
}
uint64_t CTimeUtils::GetCurrentTickCount()
{
return ::GetTickCount64();
}