Converting epoch time to "real" date/time

Viewed 82188

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 a bit ugly:

void DateTime::splitTicks(time_t time) {
    seconds = time % 60;
    time /= 60;
    minutes = time % 60;
    time /= 60;
    hours = time % 24;
    time /= 24;

    year = DateTime::reduceDaysToYear(time);
    month = DateTime::reduceDaysToMonths(time,year);
    day = int(time);
}

int DateTime::reduceDaysToYear(time_t &days) {
    int year;
    for (year=1970;days>daysInYear(year);year++) {
        days -= daysInYear(year);
    }
    return year;
}

int DateTime::reduceDaysToMonths(time_t &days,int year) {
    int month;
    for (month=0;days>daysInMonth(month,year);month++)
        days -= daysInMonth(month,year);
    return month;
}

you can assume that the members seconds, minutes, hours, month, day, and year all exist.

Using the for loops to modify the original time feels a little off, and I was wondering if there is a "better" solution to this.

7 Answers
time_t t = unixTime;
cout << ctime(&t) << endl;

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

To convert a epoch string to UTC

string epoch_to_utc(string epoch) {
  long temp = stol(epoch);
  const time_t old = (time_t)temp;
  struct tm *oldt = gmtime(&old);
  return asctime(oldt);
}

and then it can be called as

  string temp = "245446047";
  cout << epoch_to_utc(temp);

outputs:

Tue Oct 11 19:27:27 1977
Related