如何正确将字符串转换为标准::时间::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::d ate_time::p arse_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::d ate_time::p arse_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));
}
相关文章:
- 如何在c++中使用system()来运行包含空格的python脚本
- 使用 SendInput 或 mouse_event 不适用于 clock()?
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- C++/CLI System.AccessViolation在托管类中调用非托管函数时出现异常
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 程序在使用 system() 启动另一个可执行文件时停止
- 为什么我的 DeviceInformation 对象没有 System.Devices.InterfaceClassGuid 属性?
- 为什么"using System;"不被视为不良做法?
- C++ 合并字符串以'system'函数错误
- System.AccessViolationException:shared_ptr C# .NET 和 C++ 应用程
- 将 Vcl::Controls::TCaption aka (System::UnicodeString) 转换为 co
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- Python os.system() 返回错误值
- 使用 system() 函数在C++程序中运行 cmd 命令
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- system() 无法运行我的程序,因为空间
- How to recover system gcc compiler on centos 6
- 导出 c++ 函数并使用 c# System.AccessViolationException 中的函数
- c++ 中的 clock() 时间和 java 中的 System.CurrentTimeMillis() 之间的时间差