Converting unix timestamp to YYYY-MM-DD HH:MM:SS

狂风中的少年 提交于 2019-12-23 10:26:18

问题


I have a Unix timestamp that I need to get the individual year, month, day, hour, minute and second values from. I never was very good in math class so I was wondering if you guys could help me out a little :)

I have to do everything myself (no time.h functions). The language is C.


回答1:


Disclaimer: The following code does not account for leap years or leap seconds [Unix time does not account for leap seconds. They're overrated, anyway. -Ed]. Also, I did not test it, so there may be bugs. It may kick your cat and insult your mother. Have a nice day.

Let's try a little psuedocode (Python, really):

# Define some constants here...

# You'll have to figure these out.  Don't forget about February (leap years)...
secondsPerMonth = [ SECONDS_IN_JANUARY, SECONDS_IN_FEBRUARY, ... ]

def formatTime(secondsSinceEpoch):
    # / is integer division in this case.
    # Account for leap years when you get around to it :)
    year = 1970 + secondsSinceEpoch / SECONDS_IN_YEAR
    acc = secondsSinceEpoch - year * SECONDS_IN_YEAR

    for month in range(12):
        if secondsPerMonth[month] < acc:
            acc -= month
            month += 1

    month += 1

    # Again, / is integer division.
    days = acc / SECONDS_PER_DAY
    acc -= days * SECONDS_PER_DAY

    hours = acc / SECONDS_PER_HOUR
    acc -= hours * SECONDS_PER_HOUR

    minutes = acc / SECONDS_PER_MINUTE
    acc -= minutes * SECONDS_PER_MINUTE

    seconds = acc

    return "%d-%d-%d %d:%d%d" % (year, month, day, hours, minutes, seconds)

If I goofed up, please let me know. Doing this in C shouldn't be too much harder.




回答2:


You really do not want to do this by hand. You could write up some simple code that assumes years, months, days, hours, minutes and seconds are all the same lengths (12 months; 28, 30, or 31 days; 24 hours; 60 minutes; and 60 seconds) and come up with the wrong answer.

To get the right answer, you have to handle leap years and leap seconds, and convert to the local time zone (with the right DST mode). (Unless you choose to only display in UTC time.)

I suggest that you have a look at the code of glibc and see how strftime works.


Edit: UNIX time does not use the leap second.




回答3:


That format is often called ISO 8601, and searching for that might help you out.




回答4:


You should have done a search - I posted a complete answer to this question over here just the other day (for UTC, at least - to adjust for other timezones just add or subtract the timezone offset in seconds from the unixtime before you call the function).




回答5:


You don't have to do math. This can be easily handled in C like this,

char *ISO_Time (
    time_t                  time
)

{
    static char             mStr[128];
    struct tm              *gmt;

    gmt = gmtime (&time);

    strftime (mStr, sizeof(mStr), "%Y-%m-%dT%H:%M:%SZ", gmt);

    return mStr;
}

Since yours is not exactly ISO time, you just need to change one line,

strftime (mStr, sizeof(mStr), "%Y-%m-%d %H:%M:%S", gmt);


来源:https://stackoverflow.com/questions/1280051/converting-unix-timestamp-to-yyyy-mm-dd-hhmmss

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!