Ich verwende den Visual Studio c++ Compiler (2010), aber die Bibliothek hat eine unterschiedliche Implementierung von ANSI C- und POSIX-Bibliotheksfunktionen.
Was ist der Unterschied zwischen ANSI C-Funktion und der Windows CRT-Implementierung? Zum Beispiel, was ist der Unterschied zwischen tzset()
und _tzset()
oder setenv()
und _setenv()
? Es scheint, dass sie das gleiche in der gleichen Weise tun...
Ich verwende MSVC (2010), sollte ich die Windows CRT-Implementierung bevorzugen?
EDIT 1
Ich möchte eine Struktur tm, die in UTC ausgedrückt ist, auf tragbare Weise in ein time_t
konvertieren, aber es gibt keine tragbare Möglichkeit, dies zu tun. Ich muss die Funktion für verschiedene Plattformen schreiben (Android, Linux, Windows, Windows CE).
Ich habe diesen Stackoverflow-Beitrag gesehen, der setenv, getenv
und tzset()
verwendet.
Edit2
Leider habe ich nach einigen Tests festgestellt, dass getenv("TZ")
auf Windows einen Nullzeiger zurückgibt. Aber warum ist es so schwierig, eine UTC-Zeitstruktur in ein time_t
zu transformieren?
Edit 3
Durch Boost habe ich dieses Codefragment in boost/chrono/io/time_point_io.hpp entdeckt. Hoffentlich hilft es mir.
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;
}