我正在使用Visual Studio c++编译器(2010年版),但该库对ANSI C和POSIX库函数有不同的实现。
ANSI C函数和Windows CRT实现之间有什么区别?例如,
我正在使用msvc(2010年版),我应该选择Windows CRT实现吗? 编辑1 好的,我想以便携的方式将一个以UTC表示的struct tm转换为
我看到了这个stackoverflow帖子,它使用
ANSI C函数和Windows CRT实现之间有什么区别?例如,
tzset()
和_tzset()
或setenv()
和_setenv()
之间有什么区别?它们似乎以相同的方式执行相同的操作...我正在使用msvc(2010年版),我应该选择Windows CRT实现吗? 编辑1 好的,我想以便携的方式将一个以UTC表示的struct tm转换为
time_t
,但没有便携的方法来做到这一点。我必须为不同的平台(Android、Linux、Windows、Windows CE)编写该函数。我看到了这个stackoverflow帖子,它使用
setenv
、getenv
和tzset
。
编辑2
抱歉,在进行一些测试后,我发现在Windows上getenv("TZ")
返回一个空指针。但是为什么将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,31,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;
}
setenv
。 - Jesse Goodtimegm()
(假设您无法直接使用boost)相当容易(也可能是最好的想法)。 - Kristian Spangsege