在C ++中将`time_t`转换为十进制年份

时间:2015-08-17 12:18:03

标签: c++ date time time-t

如何将time_t结构转换为十进制年份?

例如,对于日期2015-07-18 00:00:00,我想获得2015.625

4 个答案:

答案 0 :(得分:3)

在我的评论中寻求有关您如何前往.55的更多信息后,我将假设您实际上是get_time,因为2015年7月18日是一年中的第199天。

您需要先使用std::tm从字符串中获取时间到mktime结构。然后,在#include <ctime> #include <iostream> #include <sstream> #include <locale> #include <iomanip> #include <string.h> 的帮助下,我们应该能够获得一年中的这一天。接下来,我们可以进行快速计算以查看年份是否为闰年,然后执行除法以获得我们的比率:

完整代码

Live Demo

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);
    } 

正确调用get_time

    // call mktime to fill out other files in theTime
    std::mktime(&theTime);

mktime

    // 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;
}

最后执行除法并打印结果值

{{1}}

输出:

  

2015-07-18 00:00:00是2015.55

答案 1 :(得分:2)

您可以使用例如broken down time将其转换为std::gmtimestd::localtime或{{3}}。

细分时间结构包含年份,tm_yday成员是1月1日以来的日期。您可以使用此tm_yday成员计算小数点后的部分。

如果您想要更高的分辨率,请使用小时,分钟和秒。

答案 2 :(得分:0)

使用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).

答案 3 :(得分:0)

使用以下步骤:

  • 使用std::gmtime
  • 分隔年月和日
  • 计算X =当天和月份的天数(请记住,年份可以是a leap year);例如,2月3日X始终为31 + 3 = 34; 3月3日,闰年为31 + 28 + 3 = 6231 + 29 + 3 = 63;
  • compute Y =一年中的天数
  • 使用公式计算百分比:(X * 100.) / Y并显示三位小数