user3584114
user3584114

Reputation: 43

converting milliseconds to date in C

Is there any way of converting milliseconds to date in C?

What I am trying to do is write a small application in C that can return the financial year and the like(quarter, week) given the start month and isCurentYear bool, where the input might be milliseconds or a date!

In the first place, is there any way by which this can be achieved in C?

And if so, in the process of finding out a way of converting milliseconds to date I have found out that the use of time_t takes the current millis of our system and by creating a structure pointing to it,it permits us to extract the year,month, date, sec etc!

Refer the below code:

#include <sys/time.h>
#include<stdio.h>
#include<time.h>

void main()
{
    time_t t = time(000);
    //time_t t = time(0);
    struct tm tm = *localtime(&t);

    printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
                                       tm.tm_hour, tm.tm_min, tm.tm_sec);
}

And also, can time_t be used to store millisecond values so that it can be converted to date using tm struct?

Upvotes: 3

Views: 14111

Answers (3)

ThaveshniG
ThaveshniG

Reputation: 21

For those of us who were searching the web for an answer to apply to embedded c applications, think pic 32 programming here is the mathematical calculation:

Date in Epoch_seconds = ( (epoch_seconds / 1000) / 86400 ) + 25569

Resulting in a 5 digit answer which is 10 bits long format dd/MM/yyyy (Note: the slashes are encoded in the result here so when converting to human readable date please account for it)

Where one day = 86400 ms

and the date 1970/1/1 = 25569

example:=( (1510827144853/1000) / 86400 ) + 25569 = 43055

put 43055 in excel and format cell to date dd/MM/yyyy and it gives you 16/11/2017

Upvotes: 2

barak manos
barak manos

Reputation: 30136

Function time_t time(time_t* timer) returns the number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC. In addition, if the input argument timer != NULL, then the function also sets this argument to the same value (so you probably have no reason to call it with anything else but NULL).


Function struct tm* localtime(const time_t* timer) takes the number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC, and returns a structure that represents the equivalent time & date. If you're working on a multi-threaded application, then please note that this function is not thread safe.


As to your question - is there any way for converting milliseconds to time & date - yes, but:

  • Take into consideration that the milliseconds will be considered as of 00:00 hours, Jan 1, 1970 UTC.
  • Since the time_t type is 32-bit long, you will not be able to convert 4G*1000 milliseconds or more.

Here is a function for converting milliseconds to time & date:

struct tm* GetTimeAndDate(unsigned long long milliseconds)
{
    time_t seconds = (time_t)(milliseconds/1000);
    if ((unsigned long long)seconds*1000 == milliseconds)
        return localtime(&seconds);
    return NULL; // milliseconds >= 4G*1000
}

Upvotes: 4

user3581454
user3581454

Reputation: 101

Perhaps, you are looking for strftime function.

char text[100];
time_t now = time(NULL);
struct tm *t = localtime(&now);


strftime(text, sizeof(text)-1, "%d %m %Y %H:%M", t);
printf("Current Date: %s", text);

Upvotes: 0

Related Questions