C++ 时间类型及相互转换详解 time_t与tm

时间常见的有两种存储方式:
time_t :整数类型 用来存储从1970年到现在经过了多少秒
tm :结构类型 把日期和时间以 C 结构的形式保存,tm 结构的定义如下:
struct tm {
int tm_sec; // 秒,正常范围从 0 到 59,但允许至 61
int tm_min; // 分,范围从 0 到 59
int tm_hour; // 小时,范围从 0 到 23
int tm_mday; // 一月中的第几天,范围从 1 到 31
int tm_mon; // 月,范围从 0 到 11
int tm_year; // 自 1900 年起的年数
int tm_wday; // 一周中的第几天,范围从 0 到 6,从星期日算起
int tm_yday; // 一年中的第几天,范围从 0 到 365,从 1 月 1 日算起
int tm_isdst; // 夏令时
}

#include <time.h>
#include <stdio.h> 
 int main()  
{   time_t timep;    
    time(&timep); /*获取time_t类型的当前时间*/  
    printf("%s", asctime(gmtime(&timep)));  
    return 0;  
}  

输出为UTC时间:

Thu Oct 25 01:49:20 2018

gmtime将time_t类型的时间转换为struct tm类型的时间,按没有经过时区转换的UTC时间,然后再用asctime转换为我们常见的格式 Thu Oct 25 01:49:20 2018

修改时间输出格式:

#include <stdio.h> 
#include <time.h>
int main()
{
    char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
    time_t timep;
    struct tm *p;
   
    time(&timep); /*获得time_t结构的时间,UTC时间*/
    p = localtime(&timep); /*转换为struct tm结构的本地时间*/
    printf("%d/%d/%d ", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday);
    printf("%s %d:%d:%d\n", wday[p->tm_wday], p->tm_hour,
        p->tm_min, p->tm_sec);
    return 0;
}

输出为本地时间:

2018/10/25 Thu 09:49:20

常用时间函数:
time_t time(time_t* t);
//取得从1970年1月1日至今的秒数

char *asctime(const struct tm* timeptr);
//将结构中的信息转换为真实世界的时间,以字符串的形式显示

char *ctime(const time_t* timep);
//将timep转换为真是世界的时间,以字符串显示

struct tm* gmtime(const time_t* timep);
//将time_t表示的时间转换为没有经过时区转换的UTC时间,是一个struct tm结构指针

struct tm* localtime(const time_t* timep);
//和gmtime类似,但是它是经过时区转换的时间

time_t mktime(struct tm* timeptr);
//将struct tm 结构的时间转换为从1970年至今的秒数

C语言中,#include < time.h >

time_t timep;
time(&timep); /* 获取 time_t 类型的当前时间 */

C++中,#include < ctime >

time_t now = time(0); // 基于当前系统的当前日期/时间

转换关系如下图:
转换关系

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将 `time_point_t` 类型转换为包含年、月、日、时、分、秒和毫秒的字符串表示,你可以使用 `std::chrono::time_point_cast` 函数和 `std::put_time` 函数。下面是一个示例代码: ```cpp #include <chrono> #include <iomanip> #include <iostream> #include <sstream> using time_point_t = std::chrono::system_clock::time_point; std::string timePointToString(time_point_t timePoint) { auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(timePoint.time_since_epoch()); auto time = std::chrono::time_point_cast<std::chrono::milliseconds>(timePoint); std::time_t timeT = std::chrono::system_clock::to_time_t(time); std::tm localTime{}; #ifdef _MSC_VER localtime_s(&localTime, &timeT); #else localtime_r(&timeT, &localTime); #endif std::ostringstream oss; oss << std::put_time(&localTime, "%Y-%m-%d %H:%M:%S.") << std::setfill('0') << std::setw(3) << millis.count() % 1000; return oss.str(); } int main() { time_point_t currentTime = std::chrono::system_clock::now(); std::string currentTimeString = timePointToString(currentTime); std::cout << currentTimeString << std::endl; return 0; } ``` 在上面的示例,`timePointToString` 函数将 `time_point_t` 类型时间转换为包含年、月、日、时、分、秒和毫秒的字符串表示。首先,我们将时间转换为毫秒级别的持续时间,并使用 `std::chrono::time_point_cast` 函数将时间转换为毫秒级别的时间点。接下来,我们将毫秒数添加到 `std::tm` 结构体,并使用 `std::put_time` 函数将其格式化为字符串。最后,我们使用 `std::ostringstream` 将格式化后的字符串和毫秒数拼接起来,得到最终的字符串表示。 请注意,上述示例的代码在不同的编译器可能有所不同。对于不同的平台和编译器,你可能需要适当地调整代码以确保正确的本地时间转换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值