跨平台的c语言程序设计,c-timegm跨平台

我使用的是Visual Studio c Compiler(2010),但库具有不同的ANSI C和POSIX库的实现功能.

ANSI C功能与Windows CRT实现有什么区别?例如,tzset()和_tzset()或setenv()ans _setenv()之间有什么区别?似乎以同样的方式做同样的事情…

我正在使用msvc(2010),是否喜欢Windows CRT实现?

编辑1

那么我想以一种便携式的方式转换一个在tim_t中以UTC表示的结构体,但是没有可移植的方式来做到这一点.我必须为不同的平台(Android,Linux,Windows,Windows CE)编写功能.

我看过这篇文章:stackoverflow使用setenv,getenv和tzset

EDIT2

不幸的是,在一些测试后,我发现getenv(“TZ”)在Windows上返回一个空指针.但是为什么如此困难地将一个break utc时间结构转换为一个time_t?

编辑3

从boost我在boost / chrono / io / time_point_io.hpp中发现了这段代码.希望这能帮助我.

inline int32_t is_leap(int32_t year)

{

if(year % 400 == 0)

return 1;

if(year % 100 == 0)

return 0;

if(year % 4 == 0)

return 1;

return 0;

}

inline int32_t days_from_0(int32_t year)

{

year--;

return 365 * year + (year / 400) - (year/100) + (year / 4);

}

inline int32_t days_from_1970(int32_t year)

{

static const int days_from_0_to_1970 = days_from_0(1970);

return days_from_0(year) - days_from_0_to_1970;

}

inline int32_t days_from_1jan(int32_t year,int32_t month,int32_t day)

{

static const int32_t days[2][12] =

{

{ 0,31,59,90,120,151,181,212,243,273,304,334},{ 0,60,91,121,152,182,213,244,274,305,335}

};

return days[is_leap(year)][month-1] + day - 1;

}

inline time_t internal_timegm(std::tm const *t)

{

int year = t->tm_year + 1900;

int month = t->tm_mon;

if(month > 11)

{

year += month/12;

month %= 12;

}

else if(month < 0)

{

int years_diff = (-month + 11)/12;

year -= years_diff;

month+=12 * years_diff;

}

month++;

int day = t->tm_mday;

int day_of_year = days_from_1jan(year,month,day);

int days_since_epoch = days_from_1970(year) + day_of_year;

time_t seconds_in_day = 3600 * 24;

time_t result = seconds_in_day * days_since_epoch + 3600 * t->tm_hour + 60 * t->tm_min + t->tm_sec;

return result;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值