我有一个Unix时间戳,我需要从中获取单独的年,月,日,小时,分钟和秒。我在数学课上从来都不是很好,所以我想知道你们是否可以帮助我一点点。)
我必须自己做所有事情(没有time.h函数)。语言是C。
答案 0 :(得分:6)
免责声明:以下代码未考虑leap years 或leap seconds [Unix时间不考虑闰秒。无论如何,他们被高估了。 -Ed] 。另外,我没有测试它,所以可能有bug。它可能会踢你的猫并侮辱你的母亲。祝你有愉快的一天。
让我们尝试一下psuedocode(Python,真的):
# 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)
如果我搞砸了,请告诉我。在C中这样做不应该太难。
答案 1 :(得分:2)
你真的不想手工做这件事。您可以编写一些简单的代码,假设年,月,日,小时,分钟和秒都是相同的长度(12个月; 28,30或31天; 24小时; 60分钟;和60秒)并出现答错了。
要获得正确答案,您必须处理leap years 和leap seconds ,并转换为本地time zone(右DST }模式)。 (除非您选择仅以UTC时间显示。)
我建议您查看glibc的代码并了解strftime
的工作原理。
编辑: UNIX时间不使用闰秒。
答案 2 :(得分:1)
该格式通常称为ISO 8601,搜索该格式可能会帮助您。
答案 3 :(得分:1)
你应该已经完成了搜索 - 我在前几天发布了这个问题over here的完整答案(对于UTC,至少 - 调整其他时区只需加上或减去时区偏移,以秒为单位在调用函数之前的unixtime。)
答案 4 :(得分:0)
你不必做数学。这可以像C一样轻松处理,
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;
}
由于你的时间不完全是ISO时间,你只需要换一行,
strftime (mStr, sizeof(mStr), "%Y-%m-%d %H:%M:%S", gmt);