@@ -260,6 +260,13 @@ normalized (so that, for example, 40 October is changed into 9 November);
is set (regardless of its initial value)
to a positive value or to 0, respectively,
to indicate whether DST is or is not in effect at the specified time.
+If the initial value of
+.I tm_isdst
+is inconsistent with the one set by
+.BR mktime (),
+.I tm_hour
+(and possibly other fields)
+will be modified to normalize the time to the correct DST.
Calling
.BR mktime ()
also sets the external variable \fItzname\fP with
If the input DST value is the opposite of the one that mktime() uses, which comes from the current system timezone (see tzset(3)), mktime() will modify the hour (and if it's in a day limit, it may carry up to modify other fields) to normalize the time to the correct DST. If a user wants to avoid this, the user probably wants to use UTC time. mktime(3) uses local time, so it's not suitable for that (by itself). Consider the following solutions: For that, the easiest solution is to use timegm(3), which is non-portable (it is present in Linux and the BSDs, but not in POSIX). A portable solution (untested) might be to implement your own timegm(3): time_t portable_timegm(struct tm *tm) { tm->tm_isdst = 0; return mktime(tm) - timezone; } Another portable solution would involve setting the timezone explicitly to UTC+0 with setenv() (see tzset(3)). But this forces all of the program to use UTC time, which might not be desirable, especially in multi-threaded programs. Cc: Paul Eggert <eggert@cs.ucla.edu> Signed-off-by: Alejandro Colomar <alx.manpages@gmail.com> --- man3/ctime.3 | 7 +++++++ 1 file changed, 7 insertions(+)