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;
}
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
Vous devez vous connecter pour publier un commentaire.
- Je utiliser la macro suivante sur Windows:
comme _mkgmtime fait de même.
OriginalL'auteur Naszta
Quand David Cutler, l'équipe a commencé à travailler sur l'ordinateur Windows NT conception, en 1989, ils ne savent pas encore ce qui l'api allait être dominante. Ils ont donc créé trois d'entre eux. Win32 est une adaptation de la version 16 bits de l'api Windows. OS/2 a été pris en charge, le système d'exploitation qui était censé supplanter le DOS mais pas. Et Posix a été le troisième, a ajouté parce que le gouvernement des etats-unis de retour précise qu'ils pourraient envisager d'utiliser des systèmes d'exploitation qui ont suivi l'émergence norme Posix.
La tzset() fonction que vous mentionnez est un reste de l'api Posix. Vous avez probablement mal orthographié putenv(), même histoire. Le sous-système n'a pas de tarif bien, Win32 remporté l'api de bataille dans une grande manière et de la prise en charge Posix a été supprimé à partir de Windows en 2001. Microsoft a gardé le support pour les fonctions Posix, mais renommé avec un trait de soulignement, car ils ne font pas partie de la bibliothèque standard C. Vous êtes censé recevoir la dépréciation des avertissements lorsque vous utilisez le non-préfixés version de la fonctions. Sonne comme #vous avez défini _CRT_NONSTDC_NO_DEPRECATE de les supprimer. Mieux de ne pas le faire. Favoriser les fonctions de la bibliothèque C standard.
OriginalL'auteur Hans Passant
Pour la plupart des fonctions, que je sache, il n'y a pas de différence.
Le trait de soulignement dans le nom est là pour souligner que ce sont pas standard C fonctions: autant que je sache, il n'y a pas
tzset
nisetenv
fonctions en c ANSI. Ils sont pour la plupart les fonctions POSIX qui sont mis en œuvre par le MS CRT comme une aide pour la portabilité des autres systèmes d'exploitation.Mais ils ne prétendent pas une compatibilité POSIX, c'est pourquoi le trait de soulignement. Et c'est pourquoi vous devez être prudent et de lire les MS de la documentation sur ces fonctions... il y a des démons, il y!
OriginalL'auteur rodrigo
Ma mise en œuvre de
timegm
travaille sur windows.Doit être fine.
Ceci ne fonctionnera pas pour les fuseaux horaires à l'extérieur de +/- 12 heures. Il y a quelques.
cela ne fonctionne pas pendant l'heure, le moment, la zone est passé de l'été à l'hiver. Il y a une ambiguïté à ceux d'heure en heure locale, car la même heure locale est utilisée deux fois par nuit.
OriginalL'auteur Siewca