我在C ++应用程序中从数据库中获取时间戳作为AnsiString。 看起来像这样" 2017-09-12 09:35:10"。
现在我想将它解析回Unix时间戳。
AnsiString myDate = Query->Fields->FieldByName("MyDates")->AsString;
TDateTime = StrToDateTime(myDate);
在我的具体情况下,我得到以下日期: 2017-08-10 08:43:35
但我获得的Unixtimestamp是: 42957.363599537
01-01-1970 12:55:57 计算回可读格式。
我在这里缺少什么?!...
答案 0 :(得分:0)
你有不 Unix TimeStamp,但是TDateTime
。以下内容来自Builder的文档:
TDateTime值的组成部分是具有的天数 自1899年12月30日起通过。 TDateTime值的小数部分是 一天中的时间。
在其他情况下,Unix TimeStump是从1970年1月1日起的秒数
答案 1 :(得分:0)
您可以尝试使用扩展C ++ 11 <chrono>
标头的Howard Hinnant's free, open source, header-only, date/time library来处理日历计算。
#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);
}
输出:
1502354615
2017-08-10 08:43:35
答案 2 :(得分:0)
C ++ Builder 6及更高版本在DateTimeToUnix()
单元中有一个DateUtils
函数:
#include <SysUtils.hpp>
#include <DateUtils.hpp>
AnsiString myDateStr = Query->Fields->FieldByName("MyDates")->AsString;
TDateTime myDate = StrToDateTime(myDateStr);
__int64 myTimestamp = DateTimeToUnix(myDate);
如果您使用的是C ++ Builder 5或更早版本,则可以像这样实现自己的DateTimeToUnix()
函数:
#include <SysUtils.hpp>
// Days between TDateTime basis (12/31/1899) and Unix time_t basis (1/1/1970)
const __int64 UnixDateDelta = 25569;
__int64 DateTimeToMilliseconds(const TDateTime &ADateTime)
{
TTimeStamp LTimeStamp = DateTimeToTimeStamp(ADateTime);
return (__int64(LTimeStamp.Date) * MSecsPerDay) + LTimeStamp.Time;
}
__int64 DateTimeToUnix(const TDateTime &AValue)
{
__int64 Result = abs(DateTimeToMilliseconds(UnixDateDelta) - DateTimeToMilliseconds(AValue)) / MSecsPerSec;
if (AValue < UnixDateDelta)
Result = -Result;
return Result;
}
另请注意,您使用的StrToDateTime()
版本取决于用户当前日期/时间的区域设置。由于您正在处理非常具体的日期/时间格式,我建议您手动解析它,而不是依赖于任何特定的语言环境,例如:
#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 2006或更高版本,则可以使用接受StrToDateTime()
结构作为输入的TFormatSettings
的重载版本:
#include <SysUtils.hpp>
#include <DateUtils.hpp>
String myDateStr = Query->Fields->FieldByName("MyDates")->AsString;
TFormatSettings myFmt = TFormatSettings::Create();
myFmt.ShortDateFormat = _D("yyyy-mm-dd hh:nn:ss");
myFmt.DateSeparator = _D('-');
myFmt.TimeSeparator = _D(':');
TDateTime myDate = StrToDateTime(myDateStr, myFmt);
__int64 myTimestamp = DateTimeToUnix(myDate);