【发布时间】:2009-08-14 20:33:25
【问题描述】:
我有一个 Unix 时间戳,我需要从中获取单独的年、月、日、小时、分钟和秒值。我在数学课上从来都不是很好,所以我想知道你们能不能帮帮我:)
我必须自己做所有事情(没有 time.h 函数)。语言是 C。
【问题讨论】:
-
什么语言?是否允许使用 SDK 库?
-
问题被标记为 C。
我有一个 Unix 时间戳,我需要从中获取单独的年、月、日、小时、分钟和秒值。我在数学课上从来都不是很好,所以我想知道你们能不能帮帮我:)
我必须自己做所有事情(没有 time.h 函数)。语言是 C。
【问题讨论】:
免责声明:以下代码不考虑leap years 或leap seconds [Unix 时间不考虑闰秒。无论如何,他们被高估了。 -Ed]。另外,我没有测试它,所以可能有错误。它可能会踢你的猫并侮辱你的母亲。祝你有美好的一天。
让我们尝试一些伪代码(真的是 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 中执行此操作应该不会太难。
【讨论】:
您真的不想手动执行此操作。您可以编写一些简单的代码,假设年、月、日、小时、分钟和秒的长度都相同(12 个月;28、30 或 31 天;24 小时;60 分钟;和 60 秒)然后得出回答错误。
要得到正确答案,你必须处理leap years和leap seconds,并转换为本地time zone(使用正确的DST模式)。 (除非您选择仅以 UTC 时间显示。)
我建议你看看glibc 的代码,看看strftime 是如何工作的。
编辑: UNIX 时间不使用闰秒。
【讨论】:
这种格式通常称为ISO 8601,搜索它可能会对您有所帮助。
【讨论】:
您应该进行搜索-前几天我发布了对这个问题 over here 的完整答案(至少对于 UTC-调整其他时区只需从之前的 unixtime 添加或减去时区偏移量(以秒为单位)你调用函数)。
【讨论】:
你不必做数学。这可以像这样在 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);
【讨论】: