C Unixtimestamp和可读的时间格式
C++ UnixTimestamp and readable time format
我从我的C 应用程序中的数据库中获得了一个时间戳作为隔离。看起来" 2017-09-12 09:35:10"。
现在我想将其解析回Unix Timestamp。
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 计算回可读格式。
我在这里缺少什么?!...
您得到不是 unix时间戳,而是TDateTime
。以下来自Builder的文档:
tdateTime值不可或缺的部分是 自1899年12月30日以来通过。tdatementime值的分数部分为 一天中的时间。
在其他情况下,Unix Timestump是01.01.1970
您可以尝试霍华德·辛南特(Howard Hinnant)的免费,开源,仅标题,日期/时间库,该日期/时间库扩展了C 11 <chrono>
标题以处理日历计算。
#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 %Tn", Unixtimestamp);
}
输出:
1502354615
2017-08-10 08:43:35
c 构建器6及以后在DateUtils
单元中具有DateTimeToUnix()
功能:
#include <SysUtils.hpp>
#include <DateUtils.hpp>
AnsiString myDateStr = Query->Fields->FieldByName("MyDates")->AsString;
TDateTime myDate = StrToDateTime(myDateStr);
__int64 myTimestamp = DateTimeToUnix(myDate);
如果您使用的是C 构建器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 建筑商2006或更高版本,则可以使用StrToDateTime()
的超载版本,该版本接受TFormatSettings
struct作为输入:
#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);
- C++20 标准::时间::d格式的缺点
- 有没有办法使用 Boost 获取区域时间格式?
- 这种日期和时间格式是什么?
- 标准::get_time 中的日期时间格式
- 如何在 NetBeans 模板中更改时间格式
- 升压C 的时期时间/时间格式
- C Unixtimestamp和可读的时间格式
- 语言环境"en_US"中 std::time_get::get_time() 的正确时间格式是什么?
- 如何将存储在字符串变量中的时间转换为时间格式
- 如何将EPOCH时间转换为时间格式(hh:mm)
- 使用C++将任何形式的日期-时间字符串格式更改为美国日期-时间格式
- 如何将浮点数切换为时间格式
- boost::chrono::system_clock - 如何将当前时间格式化为字符串
- 时间格式 HH:MM:SS 输入
- 用C++设置带有小数秒的日期和时间格式
- c++检查有效的日期时间格式
- 将整数转换为时间格式
- c++中的数据和时间格式
- 如何在C++中将日期时间格式从yyyy-MM-dd转换为yyyy/MM/dd
- 使用c++中的strptime将字符串转换为特定的日期时间格式