3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS.
13 #include "support/lyxtime.h"
15 #include "support/debug.h"
16 #include "support/environment.h"
17 #include "support/lstrings.h"
18 #include "support/qstring_helpers.h"
34 string const formatted_time(time_t t, string const & fmt)
36 struct tm * loc_tm = localtime(&t);
38 strftime(date, sizeof(date), fmt.c_str(), loc_tm);
43 time_t from_ctime(string t)
45 // Example for the format: "Sun Nov 6 10:39:39 2011\n"
46 // Generously remove trailing '\n' (and other whitespace if needed)
47 t = trim(t, " \t\r\n");
48 #if QT_VERSION >= 0x040400
49 // toDateTime() is too stupid to recognize variable amounts of
50 // whitespace (needed because ctime() outputs double spaces before
51 // single digit day numbers and hours)
52 t = subst(t, " ", " ");
53 QString const format("ddd MMM d H:mm:ss yyyy");
55 QDateTime loc_dt = loc.toDateTime(toqstr(t), format);
56 if (!loc_dt.isValid()) {
57 LYXERR(Debug::LOCALE, "Could not parse `" << t
58 << "´ (invalid format)");
59 return static_cast<time_t>(-1);
61 return loc_dt.toTime_t();
63 #error "The minimum required Qt version on windows is Qt 4.4."
65 // strptime() is not available on windows (defined by POSIX)
67 // strptime() uses the current locale, so we need to switch to "C"
68 LYXERR(Debug::LOCALE, "Setting LC_ALL and LC_TIME to C");
69 string oldLC_ALL = getEnv("LC_ALL");
70 string oldLC_TIME = getEnv("LC_TIME");
71 if (!setEnv("LC_ALL", "C"))
72 LYXERR(Debug::LOCALE, "\t... LC_ALL failed!");
73 if (!setEnv("LC_TIME", "C"))
74 LYXERR(Debug::LOCALE, "\t... LC_TIME failed!");
77 char const * const format = "%a%n%b%n%d%n%T%n%Y";
78 char * remainder = strptime(t.c_str(), format, &loc_tm);
80 LYXERR(Debug::LOCALE, "Resetting LC_ALL and LC_TIME");
81 if(!setEnv("LC_TIME", oldLC_TIME))
82 LYXERR(Debug::LOCALE, "\t... LC_TIME failed!");
83 if (!setEnv("LC_ALL", oldLC_ALL))
84 LYXERR(Debug::LOCALE, "\t... LC_ALL failed!");
87 LYXERR(Debug::LOCALE, "Could not parse `" << t
88 << "´ (invalid format)");
89 return static_cast<time_t>(-1);
91 if (*remainder != '\0') {
92 LYXERR(Debug::LOCALE, "Could not parse `" << t
93 << "´ (excess characters)");
94 return static_cast<time_t>(-1);
96 return mktime(&loc_tm);
100 } // namespace support