timegm跨平台 [英] timegm cross platform

查看:90
本文介绍了timegm跨平台的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Visual Studio c ++编译器(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()有什么区别 ans _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

我想以可移植的方式转换以UTC表示的struct tm在 time_t 中,但是没有可移植的方法来执行此操作。我必须为不同的平台(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

Edit2

不幸的是,经过一些测试,我发现 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:

#define timegm _mkgmtime

_mkgmtime 相同。

这篇关于timegm跨平台的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆