将时代时间转换为“实际”约会时间 [英] Converting epoch time to "real" date/time

查看:114
本文介绍了将时代时间转换为“实际”约会时间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想做的是将一个时代(从1970年1月1日以来的秒数)转换为真实时间(m / d / yh:m:s)



到目前为止,我有以下算法,对我来说感觉有点丑陋:

  void DateTime :: splitTicks (time_t 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;
(年= 1970;天> daysInYear(年);年++){
days - = daysIn年(年);
}
回报年;
}

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

返回月
}

你可以假设成员分钟小时 都存在。



使用循环修改原来的时间感觉有点偏离,我想知道是否有更好的解决方案。

解决方案

小心闰年在你的日子中的功能。



如果你想要非常高的性能,你可以预先计算该对可以一个月到达+年,然后计算日/小时/分/秒。



一个很好的解决方案是 * gmtime - 将日历时间转换为分解时间
* /
/ * $ He ader:gmtime.c,v 1.4 91/04/22 13:20:27 ceriel Exp $ * /

#include< time.h>
#include< limits.h>
#includeloc_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;
注册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; / *第0天是星期日* /
while(dayno> = YEARSIZE(year)){
dayno - = YEARSIZE(year);
年++;
}
timep-> tm_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;

返回timep;
}


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.

解决方案

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

这篇关于将时代时间转换为“实际”约会时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆