如何将time_t
结构转换为十进制年份?
例如,对于2015-07-18 00:00:00
我想获得的日期2015.625
。
在我的评论寻求更多关于你如何来到的信息之后.625
,我会假设你的意思是.55
因为 2015 年 7 月 18 日是一年中的第 199 天。
您需要首先使用get_time
将时间从字符串获取到std::tm
结构中。然后,在一些帮助下,mktime
我们应该能够得到一年中的某一天。之后,我们可以快速计算一下年份是否是闰年,然后进行除法得到我们的比率:
#include <ctime>
#include <iostream>
#include <sstream>
#include <locale>
#include <iomanip>
#include <string.h>
int main()
{
std::tm theTime = {};
// initialize timeToConvert with the Year-Month-Day Hours:Minutes:Seconds string you want
std::string timeToConvert = "2015-07-18 00:00:00";
std::istringstream timeStream(timeToConvert);
// need to use your locale (en-US)
timeStream.imbue(std::locale("en_US.UTF-8"));
timeStream >> std::get_time(&theTime, "%Y-%m-%d %H:%M:%S");
if (timeStream.fail())
{
std::cerr << "Parse failed\n";
exit(0);
}
// call mktime to fill out other files in theTime
std::mktime(&theTime);
// get years since 1900
int year = theTime.tm_year + 1900;
/* determine if year is leap year:
If the year is evenly divisible by 4, go to step 2. ...
If the year is evenly divisible by 100, go to step 3. ...
If the year is evenly divisible by 400, go to step 4. ...
The year is a leap year (it has 366 days).
The year is not a leap year (it has 365 days).
*/
bool isLeapYear = year % 4 == 0 &&
year % 100 == 0 &&
year % 400 == 0;
// get number of days since January 1st
int days = theTime.tm_yday+1; // Let January 1st be the 1st day of year, not 0th
// get number of days in this year (either 365 or 366 if leap year)
int daysInYear = isLeapYear ? 366 : 365;
double yearAsFloat = static_cast<double>(year) + static_cast<double>(days)/static_cast<double>(daysInYear);
std::cout << timeToConvert << " is " << yearAsFloat << std::endl;
}
输出:
2015-07-18 00:00:00 是 2015.55
您可以使用 eg或将其转换为细分时间。std::gmtime
std::localtime
分解的时间结构包含年份和一个tm_yday
成员,即自 1 月 1 日以来的天数。您可以使用该tm_yday
成员计算小数点后的部分。
如果您想要更高的分辨率,也可以使用小时、分钟和秒。
使用以下步骤:
std::gmtime
。X
= 一天和一个月中的天数(请记住,年份可能是闰年);例如,对于 2 月 3 日X
将始终31 + 3 = 34;
为 3 月 3 日,则为31 + 28 + 3 = 62
或31 + 29 + 3 = 63
闰年;Y
= 一年的天数(X * 100.) / Y
并以小数点后三位显示使用 strftime
struct stat info;
char buff[20];
struct tm * timeinfo;
stat(workingFile, &info);
timeinfo = localtime (&(info.st_mtime));
strftime(buff, 20, "%b %d %H:%M", timeinfo);
printf("%s",buff);
格式:
%b - The abbreviated month name according to the current locale.
%d - The day of the month as a decimal number (range 01 to 31).
%H - The hour as a decimal number using a 24-hour clock (range 00 to 23).
%M - The minute as a decimal number (range 00 to 59).