• C++学习之路: 时间戳 封装成类


     1 #ifndef TIMESTAMP_H
     2 #define TIMESTAMP_H 
     3 
     4 #include <string>
     5 #ifndef __STDC_FORMAT_MACROS
     6 #define __STDC_FORMAT_MACROS
     7 #endif /* __STDC_FORMAT_MACROS */
     8 #include <inttypes.h>
     9 
    10 class Timestamp
    11 {
    12 public:
    13     Timestamp();
    14     Timestamp(int64_t value);
    15 
    16     bool isValid() const
    17     { return value_ > 0; }
    18 
    19     std::string toString() const;
    20     std::string toFormatString() const;  
    21 
    22     static Timestamp now();           //获取时间戳
    23 
    24 private:
    25     int64_t value_; //微秒级别的时间戳
    26 };
    27 
    28 
    29 #endif  /*TIMESTAMP_H*/

    源文件

     1 #include "Timestamp.h"
     2 #include <time.h>
     3 #include <sys/time.h>
     4 #include <stdio.h>
     5 #include <string.h>
     6 using namespace std;
     7 
     8 
     9 Timestamp::Timestamp()
    10     :value_(0)
    11 {
    12 
    13 }
    14 
    15 Timestamp::Timestamp(int64_t value)
    16     :value_(value)
    17 {
    18 
    19 }
    20 
    21 string Timestamp::toString() const
    22 {
    23     //1411373695.488096
    24     int64_t sec = value_ / (1000 * 1000);
    25     int64_t usec = value_ % (1000 * 1000);
    26     // %06lld
    27     char text[32] = {0};
    28     snprintf(text, sizeof text, "%lld.%06lld", sec, usec);
    29 
    30     return string(text);
    31 }
    32 
    33 string Timestamp::toFormatString() const
    34 {
    35     //20140922 08:14:55.488096
    36     time_t sec = value_ / (1000 * 1000);
    37     int64_t usec = value_ % (1000 * 1000);
    38     struct tm st;
    39     //gmtime_r(&sec, &st);
    40     localtime_r(&sec, &st);         //localtime只是把时间戳转换为我们所熟知的 2014.7.40 xx:xx:xx 的格式 并不获取时间
    41 
    42     char text[100] = {0};
    43     snprintf(text, sizeof text, "%04d%02d%02d %02d:%02d:%02d.%06lld", st.tm_year + 1900, st.tm_mon + 1, st.tm_mday, st.tm_hour, st.tm_min
    44         , st.tm_sec, usec);
    45     return string(text);
    46 }
    47 
    48 Timestamp Timestamp::now()
    49 {
    50     struct timeval tv;
    51     memset(&tv, 0, sizeof tv);
    52     gettimeofday(&tv, NULL);           //获取时间戳偏移量  核心函数,获取1970.1.1 00:00:00 到现在经过的秒数,精确到毫秒级
    53 
    54     int64_t val = 0;
    55     val += static_cast<int64_t>(tv.tv_sec) * 1000 * 1000;
    56     val += tv.tv_usec;
    57 
    58     return Timestamp(val);
    59 }

    测试文件

     1 #include "Timestamp.h"
     2 #include <iostream>
     3 using namespace std;
     4 
     5 int main(int argc, char const *argv[])
     6 {
     7     Timestamp now = Timestamp::now();
     8 
     9     cout << now.toString() << endl;
    10     cout << now.toFormatString() << endl;
    11     return 0;
    12 }
  • 相关阅读:
    我的Git教程 之 初始化本地库
    再学Java 之 Integer 包装类缓存
    再学Java 之 private、protected、public和default的作用域
    再学Java 之 形参个数可变函数
    再学Java 之 foreach循环
    解决MySQL中文乱码问题
    再学Java 之 解决No enclosing instance of type * is accessible
    从一个例子学习 instanceof 和 getclass 的区别
    如何单独启动wamp 中自带的MySQL
    网络游戏程序员须知 UDP vs TCP(转)
  • 原文地址:https://www.cnblogs.com/DLzhang/p/3987913.html
Copyright © 2020-2023  润新知