timegm de la croix-plate-forme

Je suis à l'aide de Visual Studio c++ Compilateur ( 2010 ), mais la bibliothèque est différente de la mise en œuvre de la norme ANSI C et POSIX bibliothèques de la fonction.

Quelle est la différence entre le C ANSI fonction et Windows CRT mise en œuvre? Par exemple quelle est la différence entre tzset() et _tzset() ou setenv() sna _setenv()? Il semble le faire la même chose de la même manière...

Je suis en utilisant msvc ( 2010 ), je préfère le Windows CRT mise en Œuvre?

EDIT 1

Eh bien, je veux convertir de façon portable une struct tm exprimée en UTC, dans un time_t, mais il n'y a pas de portable moyen de le faire. Je n'ai qu'à écrire la fonction pour différentes plateforme (Android, Linux, Windows, Windows CE ).

J'ai vu cette stackoverflow post qui utilise setenv, getenv et tzset

Edit2

Malheureusement, après quelques test j'ai découvert que getenv("TZ") retourne un pointeur null sur windows. Mais pourquoi est-il si difficile de transformer une heure UTC struct pour un time_t?

Edit 3

À partir de Boost, j'ai découvert ce fragment de code boost/chrono/io/time_point_io.hpp. Espérons que cela m'aide.

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;
}
Merci de voir le obsolète liste. Aussi, je ne pense pas que setenv est disponible avec MSVC.
setenv n'est pas présent... mais il est putenv
Cool que vous avez trouvé le code boost. Ceci suggère que c'est plutôt facile (et sans doute la meilleure idée) pour mettre en œuvre/réimplémenter un 100% portable timegm() (en supposant que vous ne pouvez pas utiliser boost directement).

OriginalL'auteur elvis.dukaj | 2013-05-20