Converting epoch time to “real” date/time

后端 未结 6 660
情歌与酒
情歌与酒 2020-11-30 09:38

What I want to do is convert an epoch time (seconds since midnight 1/1/1970) to \"real\" time (m/d/y h:m:s)

So far, I have the following algorithm, which to me feels

相关标签:
6条回答
  • 2020-11-30 10:11

    Be careful about leap years in your daysInMonth function.

    If you want very high performance, you can precompute the pair to get to month+year in one step, and then calculate the day/hour/min/sec.

    A good solution is the one in the gmtime source code:

    /*
     * gmtime - convert the calendar time into broken down time
     */
    /* $Header: gmtime.c,v 1.4 91/04/22 13:20:27 ceriel Exp $ */
    
    #include        <time.h>
    #include        <limits.h>
    #include        "loc_time.h"
    
    struct tm *
    gmtime(register const time_t *timer)
    {
            static struct tm br_time;
            register struct tm *timep = &br_time;
            time_t time = *timer;
            register unsigned long dayclock, dayno;
            int year = EPOCH_YR;
    
            dayclock = (unsigned long)time % SECS_DAY;
            dayno = (unsigned long)time / SECS_DAY;
    
            timep->tm_sec = dayclock % 60;
            timep->tm_min = (dayclock % 3600) / 60;
            timep->tm_hour = dayclock / 3600;
            timep->tm_wday = (dayno + 4) % 7;       /* day 0 was a thursday */
            while (dayno >= YEARSIZE(year)) {
                    dayno -= YEARSIZE(year);
                    year++;
            }
            timep->tm_year = year - YEAR0;
            timep->tm_yday = dayno;
            timep->tm_mon = 0;
            while (dayno >= _ytab[LEAPYEAR(year)][timep->tm_mon]) {
                    dayno -= _ytab[LEAPYEAR(year)][timep->tm_mon];
                    timep->tm_mon++;
            }
            timep->tm_mday = dayno + 1;
            timep->tm_isdst = 0;
    
            return timep;
    }
    
    0 讨论(0)
  • 2020-11-30 10:15
    time_t t = unixTime;
    cout << ctime(&t) << endl;
    
    0 讨论(0)
  • 2020-11-30 10:16

    If your original time type is time_t, you have to use functions from time.h i.e. gmtime etc. to get portable code. The C/C++ standards do not specify internal format (or even exact type) for the time_t, so you cannot directly convert or manipulate time_t values.

    All that is known is that time_t is "arithmetic type", but results of arithmetic operations are not specified - you cannot even add/subtract reliably. In practice, many systems use integer type for time_t with internal format of seconds since epoch, but this is not enforced by standards.

    In short, use gmtime (and time.h functionality in general).

    0 讨论(0)
  • 2020-11-30 10:28

    The standard library provides functions for doing this. gmtime() or localtime() will convert a time_t (seconds since the epoch, i.e.- Jan 1 1970 00:00:00) into a struct tm. strftime() can then be used to convert a struct tm into a string (char*) based on the format you specify.

    see: http://www.cplusplus.com/reference/clibrary/ctime/

    Date/time calculations can get tricky. You are much better off using an existing solution rather than trying to roll your own, unless you have a really good reason.

    0 讨论(0)
  • 2020-11-30 10:31

    An easy way (though different than the format you wanted):

    std::time_t result = std::time(nullptr);
    std::cout << std::asctime(std::localtime(&result));
    

    Output: Wed Sep 21 10:27:52 2011

    Notice that the returned result will be automatically concatenated with "\n".. you can remove it using:

    std::string::size_type i = res.find("\n");
    if (i != std::string::npos)
        res.erase(i, res.length());
    

    Taken from: http://en.cppreference.com/w/cpp/chrono/c/time

    0 讨论(0)
  • 2020-11-30 10:35

    This code might help you.

    #include <iostream>
    #include <ctime>
    
    using namespace std;
    
    int main() {
       // current date/time based on current system
       time_t now = time(0);
       
       // convert now to string form
       char* dt = ctime(&now);
    
       cout << "The local date and time is: " << dt << endl;
    
       // convert now to tm struct for UTC
       tm *gmtm = gmtime(&now);
       dt = asctime(gmtm);
       cout << "The UTC date and time is:"<< dt << endl;
    }
    
    0 讨论(0)
提交回复
热议问题