c语言 字符串时间戳,如何将负时间戳转换为字符串. C

由于它看起来像您正在使用Windows(我是从TCHAR推断出来的),因此您可能想使用FileTimeToSystemTime().它自1601年以来一直有效.

例:

#include

#include

#include

int main(void)

{

SYSTEMTIME sysTime;

FILETIME fileTime;

long long seconds;

sysTime.wYear = 1896;

sysTime.wMonth = 4;

sysTime.wDayOfWeek = 0;

sysTime.wDay = 15;

sysTime.wHour = 0;

sysTime.wMinute = 0;

sysTime.wSecond = 0;

sysTime.wMilliseconds = 0;

if (SystemTimeToFileTime(&sysTime, &fileTime))

{

seconds = *(long long*)&fileTime;

seconds /= 10000000; // 100-nanoseconds to seconds since Jan 1st 1601

seconds -= 11644473600; // 1601 to 1970

printf("%d.%d.%d is %lld seconds from Jan 1st 1970

",

sysTime.wDay,

sysTime.wMonth,

sysTime.wYear,

seconds);

}

else

{

printf("SystemTimeToFileTime() failed with error 0x%X

", GetLastError());

}

// Now, convert it back...

seconds += 11644473600; // 1970 to 1601

seconds *= 10000000; // seconds since Jan 1st 1601 to 100-nanoseconds

*(long long*)&fileTime = seconds;

memset(&sysTime, 0, sizeof(sysTime));

if (FileTimeToSystemTime(&fileTime, &sysTime))

{

seconds /= 10000000; // 100-nanoseconds to seconds since Jan 1st 1601

seconds -= 11644473600; // 1601 to 1970

printf("%lld seconds from Jan 1st 1970 is %d.%d.%d

",

seconds,

sysTime.wDay,

sysTime.wMonth,

sysTime.wYear);

}

else

{

printf("FileTimeToSystemTime() failed with error 0x%X

", GetLastError());

}

return 0;

}

输出:

15.4.1896 is -2326147200 seconds from Jan 1st 1970

-2326147200 seconds from Jan 1st 1970 is 15.4.1896

粗略估计(1896-1970 3.5 / 12)* 365.2425 * 24 * 3600得到-2326010337.所以,我们很好.

编辑:

如果您想要不涉及任何特定于OS或编译器的功能的DIY解决方案,请使用我的秒日期转换器this answer.

此代码段显示了如何使用它:

struct tm t;

SecondsSinceEpochToDateTime(&t, -2326924800LL);

printf("-2326924800 is %d.%d.%d %d:%d:%d

",

t.tm_mday,

t.tm_mon + 1,

t.tm_year + 1900,

t.tm_hour,

t.tm_min,

t.tm_sec);

这是它的输出:

-2326924800 is 6.4.1896 0:0:0

是的,在公历中-2326924800不是15.4.1896.是6.4.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值