timegm cross platform(timegm 跨平台)
问题描述
我使用的是 Visual Studio c++ Compiler (2010),但该库具有不同的 ANSI C 和 POSIX 库函数实现.
I'm using Visual Studio c++ Compiler ( 2010 ), but the library has different implementation of ANSI C and POSIX libraries function.
ANSI C 函数和 Windows CRT 实现有什么区别?例如,tzset()
和 _tzset()
或 setenv()
和 _setenv()
之间有什么区别?似乎以同样的方式做同样的事情......
What is the difference between ANSI C function and Windows CRT implementation? For example what is the difference between tzset()
and _tzset()
or setenv()
ans _setenv()
? It seems the do the same thing in the same way...
我正在使用 msvc (2010),我是否更喜欢 Windows CRT 实现?
I'm using msvc ( 2010 ), have I to prefer the Windows CRT Implementation?
编辑 1
好吧,我想以一种可移植的方式在 time_t
中转换以 UTC 表示的 struct tm,但是没有可移植的方式来做到这一点.我必须为不同平台(Android、Linux、Windows、Windows CE)编写函数.
Well I want convert in a portable way a struct tm expressed in UTC in a time_t
, but there's no portable way to do that. I've to write the function for different platform (Android, Linux, Windows, Windows CE ).
我见过 这个stackoverflow 帖子 使用了setenv
、getenv
和tzset
I've seen this stackoverflow post that uses setenv
, getenv
and tzset
编辑 2
不幸的是,经过一些测试,我发现 getenv("TZ")
在 Windows 上返回一个空指针.但是为什么将 UTC 时间结构转换为 time_t
如此困难?
Unfortunately after some test I've discovered that getenv("TZ")
returns a null pointer on windows. But why is so difficult transform a UTC time struct to a time_t
?
编辑 3
在 Boost 中,我在 boost/chrono/io/time_point_io.hpp 中发现了这段代码.希望这对我有帮助.
From Boost I discovered this fragment of code in boost/chrono/io/time_point_io.hpp. Hope this helps me.
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;
}
推荐答案
我在 Windows 上使用以下宏:
I use the following macro on Windows:
#define timegm _mkgmtime
正如 _mkgmtime 一样.
这篇关于timegm 跨平台的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:timegm 跨平台
基础教程推荐
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 从 std::cin 读取密码 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01