您的位置:

如何优雅地将字符串转成时间戳

一、string转int

在进行字符串转时间戳前,需要先将字符串转换成int类型的秒数。可以使用std::stoi()函数将字符串转换成int。

    #include <string> 
    #include <iostream>
    #include <chrono>
    
    int main() {
        std::string str = "2022-05-30 12:12:12";
        std::tm tm = {};
        std::istringstream iss(str);
        iss >> std::get_time(&tm, "%Y-%m-%d %H:%M:%S");
        std::time_t timestamp = mktime(&tm);
        std::cout << timestamp << std::endl;
        
        return 0;
    }

以上代码中,将“2022-05-30 12:12:12”字符串转换成tm结构体对象,再使用mktime()函数将tm对象转换为时间戳。

二、string转为json

如果需要将时间戳加入到json数据中,可以使用C++ JSON库,如jsoncpp或者rapidjson。

    #include <iostream>
    #include <json/json.h>
    #include <chrono>
    
    int main() {
        std::string str = "2022-05-30 12:12:12";
        std::tm tm = {};
        std::istringstream iss(str);
        iss >> std::get_time(&tm, "%Y-%m-%d %H:%M:%S");
        std::time_t timestamp = mktime(&tm);
        
        Json::Value root;
        root["time"] = (Json::Int64)timestamp;
        std::cout << root.toStyledString() << std::endl;
        
        return 0;
    }

以上代码中,将“2022-05-30 12:12:12”字符串转换成tm结构体对象,再使用mktime()函数将tm对象转换为时间戳,最后将时间戳对象加入到json对象中。

三、string转int的方法

在转换字符串为int时,可以考虑使用std::stoi()函数或者std::stringstream类。std::stoi()函数将字符串转换为int类型;std::stringstream类也可以将字符串转化为任何基本类型。

    #include <iostream>
    #include <chrono>
    #include <string> 
    #include <sstream>
    
    int main() {
        std::string str = "2022-05-30 12:12:12";
        std::tm tm = {};
        std::istringstream iss(str);
        iss >> std::get_time(&tm, "%Y-%m-%d %H:%M:%S");
        std::time_t timestamp = mktime(&tm);
        
        int timestamp_int = std::stoi(std::to_string(timestamp));
        std::stringstream ss;
        ss << "timestamp:" << timestamp_int;
        std::cout << ss.str() << std::endl;
        
        return 0;
    }

以上代码中,将“2022-05-30 12:12:12”字符串转换成tm结构体对象,再使用mktime()函数将tm对象转换为时间戳。将时间戳对象转换为字符串,再使用std::stoi()函数将其转换成int类型。

四、string转double

有时候需要将时间表示成一个小数,可以使用std::stod()函数将时间戳转换为double类型。

    #include <iostream>
    #include <chrono>
    #include <string> 
   
    int main() {
        std::string str = "2022-05-30 12:12:12";
        std::tm tm = {};
        std::istringstream iss(str);
        iss >> std::get_time(&tm, "%Y-%m-%d %H:%M:%S");
        std::time_t timestamp = mktime(&tm);
        
        double timestamp_double = std::stod(std::to_string(timestamp));
        std::cout << timestamp_double << std::endl;
        
        return 0;
    }

以上代码中,将“2022-05-30 12:12:12”字符串转换成tm结构体对象,再使用mktime()函数将tm对象转换为时间戳。将时间戳对象转换为字符串,再使用std::stod()函数将其转换成double类型。

五、string转为list

将一个时间戳转换成一个包含年、月、日、时、分、秒的列表,可以使用std::stringstream类,把时间戳分割成多个字符串,再push_back()到list中。

    #include <iostream>
    #include <chrono>
    #include <string> 
    #include <list>
    #include <sstream>
    
    int main() {
        std::string str = "2022-05-30 12:12:12";
        std::tm tm = {};
        std::istringstream iss(str);
        iss >> std::get_time(&tm, "%Y-%m-%d %H:%M:%S");
        std::time_t timestamp = mktime(&tm);
        
        std::stringstream ss(std::to_string(timestamp));
        std::string item;
        std::list<std::string> timestamp_list;
        while (std::getline(ss, item, ' ')) {
            timestamp_list.push_back(item);
        }
        
        for (auto x : timestamp_list) {
            std::cout << x << " " ;
        }
        std::cout << std::endl;
        
        return 0;
    }

以上代码中,将“2022-05-30 12:12:12”字符串转换成tm结构体对象,再使用mktime()函数将tm对象转换为时间戳。使用std::stringstream类将时间戳分割成多个字符串,再使用push_back()函数将字符串push到list中,形成一个包含年、月、日、时、分、秒的列表。

六、string转color

有时候需要将时间表示成颜色码,可以使用std::to_string()函数将时间戳转换为颜色码。实现方法为,使用std::strftime()函数格式化时间戳,然后将格式化后的时间前加“#”,变成一个6位的十六进制字符串。

    #include <iostream>
    #include <chrono>
    #include <string> 
    
    int main() {
        std::string str = "2022-05-30 12:12:12";
        std::tm tm = {};
        std::istringstream iss(str);
        iss >> std::get_time(&tm, "%Y-%m-%d %H:%M:%S");
        std::time_t timestamp = mktime(&tm);
        
        std::strftime(outString, sizeof(outString), "%Y-%m-%d %H:%M:%S", &tm);
        std::string color_string = "#" + std::to_string(std::stoul(outString, nullptr, 0) & 0xFFFFFF);
        std::cout << color_string << std::endl;
        
        return 0;
    }

以上代码中,将“2022-05-30 12:12:12”字符串转换成tm结构体对象,再使用mktime()函数将tm对象转换为时间戳。使用std::strftime()函数格式化时间戳,使用std::stoul()函数将格式化后的字符串转换成无符号长整型,并且与0xFFFFFF进行位与操作。将所得的值转换成带“#”的十六进制字符串,即可得到颜色码。

七、string转integer

使用std::istringstream类的>>操作符将字符串转换成整型。在转换时需要判断字符串是否有非数字字符。

    #include <iostream>
    #include <string> 
    #include <sstream>
    
    int main() {
        std::string str = "2022-05-30 12:12:12";
        std::tm tm = {};
        std::istringstream iss(str);
        iss >> std::get_time(&tm, "%Y-%m-%d %H:%M:%S");
        std::time_t timestamp = mktime(&tm);
        
        std::istringstream iss1(std::to_string(timestamp));
        int timestamp_int = 0;
        iss1 >> timestamp_int;
        if (!iss1.fail()) {
            std::cout << timestamp_int << std::endl;
        } else {
            std::cout << "转换失败" << std::endl;
        }
        
        return 0;
    }

以上代码中,将“2022-05-30 12:12:12”字符串转换成tm结构体对象,再使用mktime()函数将tm对象转换为时间戳。使用std::istringstream类将时间戳转换成整型。需要注意的是,在转换时需要先判断字符串是否有非数字字符。

八、string转intc

使用sscanf()函数将字符串转换成整型。

    #include <iostream>
    #include <string> 
   
    int main() {
        std::string str = "2022-05-30 12:12:12";
        std::tm tm = {};
        std::istringstream iss(str);
        iss >> std::get_time(&tm, "%Y-%m-%d %H:%M:%S");
        std::time_t timestamp = mktime(&tm);
        
        int timestamp_int = 0;
        std::sscanf(std::to_string(timestamp).c_str(), "%d", &timestamp_int);
        std::cout << timestamp_int << std::endl;
        
        return 0;
    }

以上代码中,将“2022-05-30 12:12:12”字符串转换成tm结构体对象,再使用mktime()函数将tm对象转换为时间戳。使用sscanf()函数将时间戳转换成整型。

九、string转streamc

使用std::stringstream类来将字符串转换成整型。

    #include <iostream>
    #include <string> 
    #include <sstream>
    
    int main() {
        std::string str = "2022-05-30 12:12:12";
        std::tm tm = {};
        std::istringstream iss(str);
        iss >> std::get_time(&tm, "%Y-%m-%d %H:%M:%S");
        std::time_t timestamp = mktime(&tm);
        
        int timestamp_int = 0;
        std::stringstream stream(std::to_string(timestamp));
        stream >> timestamp_int;
        std::cout << timestamp_int << std::endl;
        
        return 0;
    }

以上代码中,将“2022-05-30 12:12:12”字符串转换成tm结构体对象,再使用mktime()函数将tm对象转换为时间戳。使用std::stringstream类将时间戳转换成整型。