C++;UnixTimestamp和可读时间格式 我从我的C++应用程序中的数据库中获得一个时间戳作为ANSILAST。 它看起来像是“2017-09-1209:35:10”

C++;UnixTimestamp和可读时间格式 我从我的C++应用程序中的数据库中获得一个时间戳作为ANSILAST。 它看起来像是“2017-09-1209:35:10”,c++,time,c++builder,ansistring,C++,Time,C++builder,Ansistring,现在我想把它解析回一个Unix时间戳 AnsiString myDate = Query->Fields->FieldByName("MyDates")->AsString; TDateTime = StrToDateTime(myDate); 在我的具体情况下,我得到以下日期:2017-08-10 08:43:35 但我得到的唯一时间戳是:42957.363599537 这是01-01-1970 12:55:57,计算回可读格式 我错过了什么 您得到的不是Unix时间戳,而

现在我想把它解析回一个Unix时间戳

AnsiString myDate = Query->Fields->FieldByName("MyDates")->AsString;
TDateTime = StrToDateTime(myDate);
在我的具体情况下,我得到以下日期:2017-08-10 08:43:35

但我得到的唯一时间戳是:42957.363599537

这是01-01-1970 12:55:57,计算回可读格式


我错过了什么

您得到的不是Unix时间戳,而是。以下内容摘自建筑商文件:

TDateTime值的整数部分是具有 自1899年12月30日起通过。TDateTime值的小数部分为 一天中的时间


在另一种情况下,Unix TimeStump是从1970年1月1日起的秒数

您得到的不是Unix时间戳,而是。以下内容摘自建筑商文件:

TDateTime值的整数部分是具有 自1899年12月30日起通过。TDateTime值的小数部分为 一天中的时间

在另一种情况下,Unix TimeStump是从1970年1月1日开始的秒数,您可以尝试扩展C++11
头以处理日历计算

#include "date.h"
#include <iostream>
#include <sstream>

int
main()
{
    std::istringstream in{"2017-08-10 08:43:35"};
    date::sys_seconds Unixtimestamp;
    in >> date::parse("%F %T", Unixtimestamp);
    std::cout << Unixtimestamp.time_since_epoch().count() << '\n';
    std::cout << date::format("%F %T\n", Unixtimestamp);
}
您可以尝试扩展C++11
头来处理日历计算

#include "date.h"
#include <iostream>
#include <sstream>

int
main()
{
    std::istringstream in{"2017-08-10 08:43:35"};
    date::sys_seconds Unixtimestamp;
    in >> date::parse("%F %T", Unixtimestamp);
    std::cout << Unixtimestamp.time_since_epoch().count() << '\n';
    std::cout << date::format("%F %T\n", Unixtimestamp);
}

C++Builder 6及更高版本在
DateUtils
单元中有一个
DateTimeToUnix()
函数:

#include <SysUtils.hpp>
#include <DateUtils.hpp>

AnsiString myDateStr = Query->Fields->FieldByName("MyDates")->AsString;
TDateTime myDate = StrToDateTime(myDateStr);
__int64 myTimestamp = DateTimeToUnix(myDate);
还要注意,您使用的
strodatetime()
版本取决于用户当前的日期/时间区域设置。由于您处理的是非常特定的日期/时间格式,因此我建议您手动解析它,而不依赖于任何特定的区域设置,例如:

#include <SysUtils.hpp>
#include <stdio.h>

AnsiString myDateStr = Query->Fields->FieldByName("MyDates")->AsString;

Word wYear, wMonth, wDay, wHour, wMin, wSec;
sscanf(myDateStr.c_str(), "%hu-%hu-%hu %hu:%hu:%hu", &wYear, &wMonth, &wDay, &wHour, &wMin, &wSec);

TDateTime myDate = EncodeDate(wYear, wMonth, wDay) + EncodeTime(wHour, wMin, wSec, 0);
__int64 myTimestamp = DateTimeToUnix(myDate);

C++Builder 6及更高版本在
DateUtils
单元中有一个
DateTimeToUnix()
函数:

#include <SysUtils.hpp>
#include <DateUtils.hpp>

AnsiString myDateStr = Query->Fields->FieldByName("MyDates")->AsString;
TDateTime myDate = StrToDateTime(myDateStr);
__int64 myTimestamp = DateTimeToUnix(myDate);
还要注意,您使用的
strodatetime()
版本取决于用户当前的日期/时间区域设置。由于您处理的是非常特定的日期/时间格式,因此我建议您手动解析它,而不依赖于任何特定的区域设置,例如:

#include <SysUtils.hpp>
#include <stdio.h>

AnsiString myDateStr = Query->Fields->FieldByName("MyDates")->AsString;

Word wYear, wMonth, wDay, wHour, wMin, wSec;
sscanf(myDateStr.c_str(), "%hu-%hu-%hu %hu:%hu:%hu", &wYear, &wMonth, &wDay, &wHour, &wMin, &wSec);

TDateTime myDate = EncodeDate(wYear, wMonth, wDay) + EncodeTime(wHour, wMin, wSec, 0);
__int64 myTimestamp = DateTimeToUnix(myDate);

它看起来像某种扩展的C++(是<代码> asks<代码> >成员变量或某种“属性”函数?)和UNIX时间戳不是浮点值,而是整数,因此您所拥有的是不同的。@如果程序员>代码>字段ByNyNAM< <代码>返回一个指向结构的指针,然后,
->AsString
可以是一个成员变量。。。但我同意,这是不可能的,但可能。@ Drkkman考虑到我怀疑它是ActuCabelo C++ Builder的类型,它可能已经添加了一些语言扩展。你认为“代码> tDATEIMECT/<代码>是UNIX时间戳吗?应用程序是用Borland C++ 5构建的。它看起来像某种扩展的C++(是<代码> ASSITS/CODE >成员变量或某种“属性”函数),UNIX时间戳不是浮点值,但是整数,所以你得到的是不同的东西。@Someprogrammerdude如果
FieldByName
返回一个指向结构的指针,那么
->AsString
可能是一个成员变量。。。但我同意,这是不可能的,但可能。@ Drkkman考虑到我怀疑它是ActuCabelo C++ Builder的类型,它可能已经添加了一些语言扩展。你认为 > TATETENT/<代码>是UNIX时间戳吗?应用程序是用Borland C++ 5构建的。不错,但是OP使用的是C++版本的Builder,它不支持C++ 11.太糟糕了。我很幸运能够在现代C++中工作。不错,但是OP使用的是一个不支持C++的旧版本的C++ Builder。我很幸运能在现代C++中工作。