char * gnc_timespec_to_iso8601_buff (Timespec ts, char * buff) { constexpr size_t max_iso_date_length = 32; const char* format = "%Y-%m-%d %H:%M:%s %q"; if (! buff) return NULL; try { GncDateTime gncdt(ts.tv_sec); auto sstr = gncdt.format(format); memset(buff, 0, sstr.length() + 1); strncpy(buff, sstr.c_str(), sstr.length()); return buff + sstr.length(); } catch(std::logic_error& err) { PWARN("Error processing time64 %" PRId64 ": %s", ts.tv_sec, err.what()); return buff; } catch(std::runtime_error& err) { PWARN("Error processing time64 %" PRId64 ": %s", ts.tv_sec, err.what()); return buff; } }
char* gnc_print_time64(time64 time, const char* format) { GncDateTime gncdt(time); auto sstr = gncdt.format(format); //ugly C allocation so that the ptr can be freed at the other end char* cstr = static_cast<char*>(malloc(sstr.length() + 1)); memset(cstr, 0, sstr.length() + 1); strncpy(cstr, sstr.c_str(), sstr.length()); return cstr; }
size_t qof_print_date_buff (char * buff, size_t len, time64 t) { if (!buff) return 0; GncDateTime gncdt(t); std::string str = gncdt.format(qof_date_format_get_string(dateFormat)); strncpy(buff, str.c_str(), len); if (str.length() >= len) buff[len - 1] = '\0'; return strlen(buff); }
time64 gnc_mktime (struct tm* time) { try { normalize_struct_tm (time); GncDateTime gncdt(*time); return static_cast<time64>(gncdt) - gncdt.offset(); } catch(std::invalid_argument) { return 0; } }
char * gnc_timespec_to_iso8601_buff (Timespec ts, char * buff) { constexpr size_t max_iso_date_length = 32; const char* format = "%Y-%m-%d %H:%M:%s %q"; if (! buff) return NULL; GncDateTime gncdt(ts.tv_sec); auto sstr = gncdt.format(format); memset(buff, 0, sstr.length() + 1); strncpy(buff, sstr.c_str(), sstr.length()); return buff + sstr.length(); }
Timespec gnc_iso8601_to_timespec_gmt(const char *cstr) { time64 time; if (!cstr) return {0, 0}; try { GncDateTime gncdt(cstr); return {static_cast<time64>(gncdt), 0}; } catch(...) { return {0, 0}; } }
struct tm* gnc_gmtime (const time64 *secs) { try { auto time = static_cast<struct tm*>(calloc(1, sizeof(struct tm))); GncDateTime gncdt(*secs); *time = gncdt.utc_tm(); return time; } catch(std::invalid_argument) { return NULL; } }
time64 gnc_timegm (struct tm* time) { try { normalize_struct_tm(time); GncDateTime gncdt(*time); *time = static_cast<struct tm>(gncdt); time->tm_sec -= gncdt.offset(); normalize_struct_tm(time); #ifdef HAVE_STRUcT_TM_GMTOFF time->tm_gmtoff = 0; #endif return static_cast<time64>(gncdt) - gncdt.offset(); } catch(std::invalid_argument) { return 0; } }
Timespec gnc_iso8601_to_timespec_gmt(const char *cstr) { time64 time; if (!cstr) return {0, 0}; try { GncDateTime gncdt(cstr); return {static_cast<time64>(gncdt), 0}; } catch(std::logic_error& err) { PWARN("Error processing %s: %s", cstr, err.what()); return {0, 0}; } catch(std::runtime_error& err) { PWARN("Error processing time64 %s: %s", cstr, err.what()); return {0, 0}; } }
Timespec gnc_dmy2timespec_neutral (int day, int month, int year) { struct tm date; memset (&date, 0, sizeof(struct tm)); date.tm_year = year - 1900; date.tm_mon = month - 1; date.tm_mday = day; date.tm_hour = 10; date.tm_min = 59; date.tm_sec = 0; GncDateTime gncdt(date); auto offset = gncdt.offset() / 3600; if (offset < -11) date.tm_hour = -offset; if (offset > 13) date.tm_hour = 23 - offset; return {gnc_timegm(&date), 0}; }
size_t qof_print_date_buff (char * buff, size_t len, time64 t) { if (!buff) return 0; try { GncDateTime gncdt(t); std::string str = gncdt.format(qof_date_format_get_string(dateFormat)); strncpy(buff, str.c_str(), len); if (str.length() >= len) buff[len - 1] = '\0'; } catch(std::logic_error& err) { PWARN("Error processing time64 %" PRId64 ": %s", t, err.what()); } catch(std::runtime_error& err) { PWARN("Error processing time64 %" PRId64 ": %s", t, err.what()); } return strlen(buff); }
char* gnc_print_time64(time64 time, const char* format) { try { GncDateTime gncdt(time); auto sstr = gncdt.format(format); //ugly C allocation so that the ptr can be freed at the other end char* cstr = static_cast<char*>(malloc(sstr.length() + 1)); memset(cstr, 0, sstr.length() + 1); strncpy(cstr, sstr.c_str(), sstr.length()); return cstr; } catch(std::runtime_error& err) { PWARN("Error processing time64 %" PRId64 ": %s", time, err.what()); return nullptr; } catch(std::logic_error& err) { PWARN("Error processing time64 %" PRId64 ": %s", time, err.what()); return nullptr; } }