簡體   English   中英

如何正確地將字符串轉換為 std::chrono::system_clock::time_point?

[英]How to properly convert string to std::chrono::system_clock::time_point?

我跟了一些很好的答案,這樣類似的問題一個

然而,在將字符串轉換為 time_point 並返回字符串后,我的代碼似乎在一小時后給出了輸出。

給出錯誤答案的代碼:

#include <string>
#include <ctime>
#include <chrono>
#include <iomanip>
#include <iostream>
#include <sstream>

using date_time = std::chrono::system_clock::time_point;

std::string dateTimeToString(date_time time) {
    std::time_t now_c = std::chrono::system_clock::to_time_t(time);
    auto tm = std::localtime(&now_c);
    char buffer[32];
    std::strftime(buffer, 32, "%Y-%m-%d %H:%M:%S", tm);
    return std::string(buffer);
}

date_time stringToDateTime(const std::string &s) {
    std::tm timeDate = {};
    std::istringstream ss(s);
    ss >> std::get_time(&timeDate, "%Y-%m-%d %H:%M:%S");
    return std::chrono::system_clock::from_time_t(mktime(&timeDate));
}

int main() {
    std::string birthday = "2000-06-05 20:20:00";
    std::cout << "Two birthday dates: \n" << birthday << " \nsecond one:\n" << dateTimeToString(stringToDateTime(birthday))
              << "\n******************\n";
    return 0;
}

和輸出:

兩個生日日期:2000-06-05 20:20:00 第二個生日:2000-06-05 21:20:00


我認為這與時區有關,但我無法解決這個問題。 我的代碼有什么問題?

您可以使用boost庫進行時間管理。

看看boost::date_time::parse_date(const std::string& s, int order_spec = ymd_order_iso)

//! Generic function to parse a delimited date (eg: 2002-02-10)
/*! Accepted formats are: "2003-02-10" or " 2003-Feb-10" or
 * "2003-Feburary-10"
 * The order in which the Month, Day, & Year appear in the argument
 * string can be accomodated by passing in the appropriate ymd_order_spec
 */

boost::date_time::parse_delimited_time_duration(const std::string& s)

//! Creates a time_duration object from a delimited string
/*! Expected format for string is "[-]h[h][:mm][:ss][.fff]".
 * If the number of fractional digits provided is greater than the 
 * precision of the time duration type then the extra digits are 
 * truncated.
 *
 * A negative duration will be created if the first character in
 * string is a '-', all other '-' will be treated as delimiters.
 * Accepted delimiters are "-:,.". 
 */

Boost 為這兩種方法制作了一個包裝函數,可以解析日期時間字符串:

template<class time_type>
inline time_type parse_delimited_time(const std::string& s, char sep) {
    typedef typename time_type::time_duration_type time_duration;
    typedef typename time_type::date_type date_type;

    //split date/time on a unique delimiter char such as ' ' or 'T'
    std::string date_string, tod_string;
    split(s, sep, date_string, tod_string);
    //call parse_date with first string
    date_type d = parse_date<date_type>(date_string);
    //call parse_time_duration with remaining string
    time_duration td = parse_delimited_time_duration<time_duration>(tod_string);
    //construct a time
    return time_type(d, td);

}

如果你想要一個不同的日期格式解析器,我做了一個稍微不同的實現:

posix_time::ptime parse_dmy_time(const std::string &s, char sep) {
    typedef typename posix_time::ptime::time_duration_type time_duration;
    typedef typename posix_time::ptime::date_type date_type;

    //split date/time on a unique delimiter char such as ' ' or 'T'
    std::string date_string, tod_string;
    split(s, sep, date_string, tod_string);
    //call parse_date with first string
    auto d = parse_date<date_type>(date_string, ymd_order_dmy);
    //call parse_time_duration with remaining string
    auto td = parse_delimited_time_duration<time_duration>(tod_string);
    //construct a time
    return {d, td};
}

不確定它有幫助,但對我有用。 在兩個步驟中添加 UTC 偏移量和 TZ 信息( %z%Z ):

std::string dateTimeToString(date_time time) {
    std::time_t now_c = std::chrono::system_clock::to_time_t(time);
    auto tm = std::localtime(&now_c);
    char buffer[32];
    std::strftime(buffer, 32, "%Y-%m-%d %H:%M:%S%z %Z", tm);
    return std::string(buffer);
}

date_time stringToDateTime(const std::string& s) {
    std::tm timeDate = {};
    std::istringstream ss(s);
    ss >> std::get_time(&timeDate, "%Y-%m-%d %H:%M:%S%z %Z");
    return std::chrono::system_clock::from_time_t(mktime(&timeDate));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM