当前位置:首页 > c++ > 正文内容

c++时间戳转年月日时分秒

xuwenyan12个月前 (02-14)c++376

时间戳转年月日时分秒是比较常用的功能,调用api localtime_s把时间戳转成tm结构体,就可以通过tm结构体中的成员得到对应的年月日时分秒,需要注意的就是tm结构体部分成员的值不是真实的值,需要做一些简单的转换。具体实现请参照下面的demo代码

实现代码demo

#include <iostream>
#include <time.h>

/**
 * 微软文档地址
 * https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/localtime-s-localtime32-s-localtime64-s?view=msvc-170
 */
class Time {
public:
  Time() : tm_({ 0 }) {
    time_t nowtime = time(0);
    /**
     * 根据微软文档,localtime_s返回0才是成功的
     * 建议详细阅读微软文档,文档地址见顶部
     */
    valid_ = (::localtime_s(&tm_, &nowtime) == 0);
  }

  Time(time_t time) : tm_({ 0 }) {
    /**
     * 根据微软文档,localtime_s返回0才是成功的
     * 建议详细阅读微软文档,文档地址见顶部
     */
    valid_ = (::localtime_s(&tm_, &time) == 0);
  }

  ~Time() {}

  /**
   * 返回值true则有效,可以正常使用
   */
  bool Valid() { return valid_; }
  int GetYear() {
    /**
     * 根据微软文档,年份是从1900年开始计算的,所以需加上1900
     * tm_year: 年份(本年减去1900)
     * 建议详细阅读微软文档,文档地址见顶部
     */
    return tm_.tm_year + 1900; 
  }
  int GetMonth() { 
    /**
     * 根据微软文档,月份是从0开始计算的
     * tm_mon: 月份(0-11;1月=0)
     * 建议详细阅读微软文档,文档地址见顶部
     */
    return tm_.tm_mon + 1;
  }
  int GetDay() { return tm_.tm_mday; }
  int GetHour() { return tm_.tm_hour; }
  int GetMinute() { return tm_.tm_min; }
  int GetSecond() { return tm_.tm_sec; }

private:
  bool   valid_;
  tm     tm_;
};

int main() {
  Time time;
  if (!time.Valid())
    return 1;

  printf("当前时间:%d年%d月%d日%d时%d分%d秒",
    time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());

  getchar();
  return 0;
}

demo结果展示

 

    文章作者:xuwenyan
    版权声明:本文为本站原创文章,转载请注明出处,非常感谢,如版权漏申明或您觉得任何有异议的地方欢迎与本站取得联系。

    扫描二维码推送至手机访问。

    版权声明:本文由艺文笔记发布,如需转载请注明出处。

    本文链接:https://www.xuwenyan.com/archives/2443

    分享给朋友:

    “c++时间戳转年月日时分秒” 的相关文章

    C++智能指针基本原理

    C++智能指针基本原理

    什么是智能指针? 最简单来说就是会自动释放内存的指针,使用方便,不用担心内存泄漏问题。它其实就是通过封装,利用对象的析构函数释放申请的内存,基本上自动释放的用法都是利用析构函数去做一些释放工作。如:自动释放的句柄 智能指针的基本实现 class TestClass { publ...

    C++如何获取控制台程序的输出内容?

    C++如何获取控制台程序的输出内容?

    很多工具程序(如ffmpeg)的进度显示往往都是以控制台字符显示的方法,我们可能需要调用这种控制台工具去完成工作,但同时又希望以友好的ui界面去显示当前的工作状态(如进度)。此时我们能想到的就是运行控制台程序,然后以某种方式去获取到控制台程序的输出,然后转换到我们的ui界面上去显示。 有多种...

    使用GDI、MFC_GDI、GDI+绘制数组RGBA序列

    使用GDI、MFC_GDI、GDI+绘制数组RGBA序列

    学习ffmpeg时遇到一个问题,ffmpeg解码出RGB颜色后怎么绘制到屏幕上,于是将GDI、MFC_GDI、GDI+等方式都记录一下 1:注意按windows的要求,R、G、B、A顺序要调整为B、G、R、A 。 2:GDI不支持透明通道A,透明通道A的值读进去以后没有作用。想要支持透...

    VC的ATL工程向导同时生成一个PS工程是做什么的?可以不要吗?

    VC的ATL工程向导同时生成一个PS工程是做什么的?可以不要吗?

    例如,我用VC2015的工程向导新建一个ATL的工程名字叫myAtl,那么VC会同时给我生成一个叫做myAtlPS的工程。这个myAtlPS工程是做什么的?什么情况下可以不需要它?什么情况下它又是必须存在的? PS工程是什么?可以不要吗? 这个PS工程叫做代理与存根(proxy&nbs...

    解决程序在xp系统总是莫名奇妙的崩溃问题(/Zc:threadSafeInit- )

    解决程序在xp系统总是莫名奇妙的崩溃问题(/Zc:threadSafeInit- )

    现象:程序在xp系统上面总是莫名其妙的崩溃,检查代码看不出任何问题,感觉代码都很好。即使你远程调试,找到了崩溃的点,当你注释了崩溃点之后,还是会崩溃到别的地方。当你遇到了这种情况的时候,不妨参照一下下面的方法看看,说不定可以解决问题。如何解决?将崩溃程序相关的所有工程代码全部关闭全局变量的线程安全检...

    ATL实现windows右键菜单扩展(ContextMenu)

    ATL实现windows右键菜单扩展(ContextMenu)

    右键菜单,即用户右击shell对象时弹出的上下文菜单(context menu)。本文记录了如何创建右键菜单的基本过程,跟着步骤一步一步来,即可创建出一个右键菜单工程。第一步,新建一个ATL工程Visual Studio—>新建项目—>ATL—>使用默认配置(一直按下一步即可)。注...