使用 std::chrono 的 2 个日期之间还剩下多少天
how many days left between 2 dates using std::chrono
我正在尝试检查我的应用程序还剩多少天,一个来自当前时间,第二个来自来自数据库的 std::string,但每次我尝试减去2 个日期使用
std::chrono::duration<int>
我得到“expected unqualified-d before = token”,不确定我的代码下面的 chrono 期望什么
void Silo::RevisarDiasRestantes(){ // Check how many days are left, if the serial is 00 is for life
// obtain the current time with std::chrono and convert to struct tm * so it can be convert to an std::string
std::time_t now_c;
std::chrono::time_point<std::chrono::system_clock> now;
typedef std::chrono::duration<int> tiempo;
struct tm * timeinfo;
char buffer[80];
now = std::chrono::system_clock::now();
now_c = std::chrono::system_clock::to_time_t(now);
time (&now_c);
timeinfo = localtime(&now_c);
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", timeinfo);
std::string str(buffer);
Log("Tiempo usando Chrono " + QString::fromStdString(str));
for (int a{0} ; a<1000 ; ) // just an standard for
{
a++;
}
// convert std::string to std::time_t and then convert to a std::chrono
std::string i = str;
std::chrono::time_point<std::chrono::system_clock> end;
struct std::tm tm;
std::istringstream iss;
iss.str(i);
iss >> std::get_time(&tm,"%Y:%m:%d %H:%M:%S");
std::time_t time = mktime(&tm);
end = std::chrono::system_clock::from_time_t(time);
tiempo = end - now; <-------------------- heres the problem
Log( "Diferencia de tiempo: " + QString::number(tiempo.count()));
}
编辑:直到今天我才注意到一件事,如果我尝试使用 istringstream std::get_time
程序编译但在运行时失败,要求在动态中“缺少 basic_istringstream”图书馆,所以我不能使用它;是否有另一种方法可以将字符串提供给 get_time?
Edit2:直到 JhonFilleau 指出问题我才注意到,不再加班,谢谢
有两个问题,JohnFilleau在评论中指出了其中一个问题。
- 您正在分配给类型而不是变量。就好像你在编码:
int = 3;
而不是:
int i = 3;
你需要这样的东西:
tiempo t = end - now;
- 您正在尝试从
system_clock::time_point
的精度(通常是微秒到纳秒)隐式转换为秒的精度。而且 chrono 不会让你隐式地进行这种转换,因为它会失去精度。
但你可以用 duration_cast
:
强制它
tiempo t = std::chrono::duration_cast<std::chrono::seconds>(end - now);
终于不用
typedef std::chrono::duration<int> tiempo;
这只是 seconds
的另一个名称,但存储在 int
中,而不是不易溢出的内容。 auto
在这里可以更方便地使用:
auto t = std::chrono::duration_cast<std::chrono::seconds>(end - now);
并且 t
的类型是 std::chrono::duration<I>
其中 I
是至少 35 位(通常为 64 位)的有符号整数类型。这种类型有一个方便的类型别名 std::chrono::seconds
.
如果你真的想要这个类型命名为tiempo
那么我推荐:
using tiempo = std::chrono::seconds;
// ...
auto t = std::chrono::duration_cast<tiempo>(end - now);
或:
tiempo t = std::chrono::duration_cast<tiempo>(end - now);
我正在尝试检查我的应用程序还剩多少天,一个来自当前时间,第二个来自来自数据库的 std::string,但每次我尝试减去2 个日期使用
std::chrono::duration<int>
我得到“expected unqualified-d before = token”,不确定我的代码下面的 chrono 期望什么
void Silo::RevisarDiasRestantes(){ // Check how many days are left, if the serial is 00 is for life
// obtain the current time with std::chrono and convert to struct tm * so it can be convert to an std::string
std::time_t now_c;
std::chrono::time_point<std::chrono::system_clock> now;
typedef std::chrono::duration<int> tiempo;
struct tm * timeinfo;
char buffer[80];
now = std::chrono::system_clock::now();
now_c = std::chrono::system_clock::to_time_t(now);
time (&now_c);
timeinfo = localtime(&now_c);
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", timeinfo);
std::string str(buffer);
Log("Tiempo usando Chrono " + QString::fromStdString(str));
for (int a{0} ; a<1000 ; ) // just an standard for
{
a++;
}
// convert std::string to std::time_t and then convert to a std::chrono
std::string i = str;
std::chrono::time_point<std::chrono::system_clock> end;
struct std::tm tm;
std::istringstream iss;
iss.str(i);
iss >> std::get_time(&tm,"%Y:%m:%d %H:%M:%S");
std::time_t time = mktime(&tm);
end = std::chrono::system_clock::from_time_t(time);
tiempo = end - now; <-------------------- heres the problem
Log( "Diferencia de tiempo: " + QString::number(tiempo.count()));
}
编辑:直到今天我才注意到一件事,如果我尝试使用 istringstream std::get_time
程序编译但在运行时失败,要求在动态中“缺少 basic_istringstream”图书馆,所以我不能使用它;是否有另一种方法可以将字符串提供给 get_time?
Edit2:直到 JhonFilleau 指出问题我才注意到,不再加班,谢谢
有两个问题,JohnFilleau在评论中指出了其中一个问题。
- 您正在分配给类型而不是变量。就好像你在编码:
int = 3;
而不是:
int i = 3;
你需要这样的东西:
tiempo t = end - now;
- 您正在尝试从
system_clock::time_point
的精度(通常是微秒到纳秒)隐式转换为秒的精度。而且 chrono 不会让你隐式地进行这种转换,因为它会失去精度。
但你可以用 duration_cast
:
tiempo t = std::chrono::duration_cast<std::chrono::seconds>(end - now);
终于不用
typedef std::chrono::duration<int> tiempo;
这只是 seconds
的另一个名称,但存储在 int
中,而不是不易溢出的内容。 auto
在这里可以更方便地使用:
auto t = std::chrono::duration_cast<std::chrono::seconds>(end - now);
并且 t
的类型是 std::chrono::duration<I>
其中 I
是至少 35 位(通常为 64 位)的有符号整数类型。这种类型有一个方便的类型别名 std::chrono::seconds
.
如果你真的想要这个类型命名为tiempo
那么我推荐:
using tiempo = std::chrono::seconds;
// ...
auto t = std::chrono::duration_cast<tiempo>(end - now);
或:
tiempo t = std::chrono::duration_cast<tiempo>(end - now);