时间戳转换(Win32, C++)

文章介绍了C++类CTimeUtils中的各种时间处理函数,包括获取当前时间戳、日期字符串、时间字符串转换以及系统启动时间等实用功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值