diff --git a/doc/emacs/cmdargs.texi b/doc/emacs/cmdargs.texi index 646c8da1bb8..444d30527f8 100644 --- a/doc/emacs/cmdargs.texi +++ b/doc/emacs/cmdargs.texi @@ -641,8 +641,9 @@ to put temporary files (@pxref{Backup}). Emacs tries to use @env{TMP}, then @env{TEMP}, and finally @file{c:/temp}. @item TZ @vindex TZ, environment variable -This specifies the current time zone and possibly also daylight -saving time information. On MS-DOS, if @env{TZ} is not set in the +This specifies the default time zone and possibly also daylight +saving time information. @xref{Time Zone Rules,,, elisp, The GNU +Emacs Lisp Reference Manual}. On MS-DOS, if @env{TZ} is not set in the environment when Emacs starts, Emacs defines a default value as appropriate for the country code returned by DOS@. On MS-Windows, Emacs does not use @env{TZ} at all. diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi index 03d04ba3cf3..6e0edec2943 100644 --- a/doc/lispref/os.texi +++ b/doc/lispref/os.texi @@ -19,6 +19,7 @@ terminal and the screen. * System Environment:: Distinguish the name and kind of system. * User Identification:: Finding the name and user id of the user. * Time of Day:: Getting the current time. +* Time Zone Rules:: Rules for time zones and daylight saving time. * Time Conversion:: Converting a time from numeric form to calendrical data and vice versa. * Time Parsing:: Converting a time from numeric form to text @@ -1259,7 +1260,7 @@ information may some day be added at the end. The argument @var{time}, if given, specifies a time to format, instead of the current time. The optional argument @var{zone} -defaults to the current time zone rule. +defaults to the current time zone rule. @xref{Time Zone Rules}. @example @group @@ -1296,26 +1297,9 @@ For example, if @var{time} is a number, @code{(time-to-seconds or rounding errors occur. @end defun -@defun current-time-zone &optional time zone -@cindex time zone, current -This function returns a list describing the time zone that the user is -in. - -The value has the form @code{(@var{offset} @var{name})}. Here -@var{offset} is an integer giving the number of seconds ahead of Universal Time -(east of Greenwich). A negative value means west of Greenwich. The -second element, @var{name}, is a string giving the name of the time -zone. Both elements change when daylight saving time begins or ends; -if the user has specified a time zone that does not use a seasonal time -adjustment, then the value is constant through time. - -If the operating system doesn't supply all the information necessary to -compute the value, the unknown elements of the list are @code{nil}. - -The argument @var{time}, if given, specifies a time value to -analyze instead of the current time. The optional argument @var{zone} -defaults to the current time zone rule. -@end defun +@node Time Zone Rules +@section Time Zone Rules +@cindex time zone rules @vindex TZ, environment variable The default time zone is determined by the @env{TZ} environment @@ -1324,6 +1308,15 @@ to default to Universal Time with @code{(setenv "TZ" "UTC0")}. If @env{TZ} is not in the environment, Emacs uses system wall clock time, which is a platform-dependent default time zone. +The set of supported @env{TZ} strings is system-dependent. GNU and +many other systems support the tzdata database, e.g., +@samp{"America/New_York"} specifies the time zone and daylight saving +time history for locations near New York City. GNU and most other +systems support POSIX-style @env{TZ} strings, e.g., +@samp{"EST+5EDT,M4.1.0/2,M10.5.0/2"} specifies the rules used in New +York from 1987 through 2006. All systems support the string +@samp{"UTC0"} meaning Universal Time. + @cindex time zone rule Functions that convert to and from local time accept an optional @dfn{time zone rule} argument, which specifies the conversion's time @@ -1334,6 +1327,29 @@ If it is @code{t}, the conversion uses Universal Time. If it is a string, the conversion uses the time zone rule equivalent to setting @env{TZ} to that string. +@defun current-time-zone &optional time zone +@cindex time zone, current +This function returns a list describing the time zone that the user is +in. + +The value has the form @code{(@var{offset} @var{abbr})}. Here +@var{offset} is an integer giving the number of seconds ahead of Universal Time +(east of Greenwich). A negative value means west of Greenwich. The +second element, @var{abbr}, is a string giving an abbreviation for the +time zone, e.g., @samp{"CST"} for China Standard Time or for +U.S. Central Standard Time. Both elements can change when daylight +saving time begins or ends; if the user has specified a time zone that +does not use a seasonal time adjustment, then the value is constant +through time. + +If the operating system doesn't supply all the information necessary to +compute the value, the unknown elements of the list are @code{nil}. + +The argument @var{time}, if given, specifies a time value to +analyze instead of the current time. The optional argument @var{zone} +defaults to the current time zone rule. +@end defun + @node Time Conversion @section Time Conversion @cindex calendrical information @@ -1358,8 +1374,8 @@ as traditional Gregorian years do; for example, the year number @defun decode-time &optional time zone This function converts a time value into calendrical information. If you don't specify @var{time}, it decodes the current time, and similarly -@var{zone} defaults to the current time zone rule. The return -value is a list of nine elements, as follows: +@var{zone} defaults to the current time zone rule. @xref{Time Zone Rules}. +The return value is a list of nine elements, as follows: @example (@var{seconds} @var{minutes} @var{hour} @var{day} @var{month} @var{year} @var{dow} @var{dst} @var{utcoff}) @@ -1406,6 +1422,7 @@ to stand for years above 1900, or years above 2000, you must alter them yourself before you call @code{encode-time}. The optional argument @var{zone} defaults to the current time zone rule. +@xref{Time Zone Rules}. In addition to the usual time zone rule values, it can also be a list (as you would get from @code{current-time-zone}) or an integer (as from @code{decode-time}), applied without any further alteration for @@ -1449,8 +1466,8 @@ corresponding time value. This function converts @var{time} (or the current time, if @var{time} is omitted) to a string according to -@var{format-string}. The conversion uses the time zone rule @var{zone} -(or the current time zone rule, if omitted). The argument +@var{format-string}. The conversion uses the time zone rule @var{zone}, which +defaults to the current time zone rule. @xref{Time Zone Rules}. The argument @var{format-string} may contain @samp{%}-sequences which say to substitute parts of the time. Here is a table of what the @samp{%}-sequences mean: diff --git a/etc/NEWS b/etc/NEWS index 59f8d086717..00f5aadd856 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2125,11 +2125,11 @@ quotation marks. *** Time conversion functions now accept an optional ZONE argument that specifies the time zone rules for conversion. ZONE is omitted or nil for Emacs local time, t for Universal Time, 'wall' for system wall -clock time, or a string as in 'set-time-zone-rule' for a time zone -rule. The affected functions are 'current-time-string', -'current-time-zone', 'decode-time', and 'format-time-string'. The -function 'encode-time', which already accepted a simple time zone rule -argument, has been extended to accept all the new forms. +clock time, or a string as in the TZ environment variable. The +affected functions are 'current-time-string', 'current-time-zone', +'decode-time', and 'format-time-string'. The function 'encode-time', +which already accepted a simple time zone rule argument, has been +extended to accept all the new forms. *** Incompatible change in the third argument of 'format-time-string'. Previously, any non-nil argument was interpreted as specifying Universal Time. diff --git a/etc/PROBLEMS b/etc/PROBLEMS index 2ccb7711376..4288808f407 100644 --- a/etc/PROBLEMS +++ b/etc/PROBLEMS @@ -2181,11 +2181,11 @@ month names with consistent widths for some locales on some versions of Windows. This is caused by a deficiency in the underlying system library function. -** Problems with set-time-zone-rule function +** Non-US time zones. -The function set-time-zone-rule gives incorrect results for many -non-US timezones. This is due to over-simplistic handling of -daylight savings switchovers by the Windows libraries. +Many non-US time zones are implemented incorrectly. This is due to +over-simplistic handling of daylight savings switchovers by the +Windows libraries. ** Files larger than 4GB report wrong size in a 32-bit Windows build diff --git a/lisp/calendar/solar.el b/lisp/calendar/solar.el index bf8bedd599e..6fec8055319 100644 --- a/lisp/calendar/solar.el +++ b/lisp/calendar/solar.el @@ -173,7 +173,7 @@ delta. At present, delta = 0.01 degrees, so the value of the variable ;;; End of user options. (defvar solar-sidereal-time-greenwich-midnight nil - "Sidereal time at Greenwich at midnight (universal time).") + "Sidereal time at Greenwich at midnight (Universal Time).") (defvar solar-northern-spring-or-summer-season nil "Non-nil if northern spring or summer and nil otherwise. @@ -413,8 +413,8 @@ Result is in days. For the years 1800-1987, the maximum error is (defun solar-ephemeris-time (time) "Ephemeris Time at moment TIME. TIME is a pair with the first component being the number of Julian centuries -elapsed at 0 Universal Time, and the second component being the universal -time. For instance, the pair corresponding to November 28, 1995 at 16 UT is +elapsed at 0 Universal Time, and the second component counting Universal Time +hours. For instance, the pair corresponding to November 28, 1995 at 16 UT is \(-0.040945 16), -0.040945 being the number of Julian centuries elapsed between Jan 1, 2000 at 12 UT and November 28, 1995 at 0 UT. @@ -430,7 +430,7 @@ Result is in Julian centuries of ephemeris time." "Right ascension (in hours) and declination (in degrees) of the sun at TIME. TIME is a pair with the first component being the number of Julian centuries elapsed at 0 Universal Time, and the second -component being the universal time. For instance, the pair +component counting Universal Time hours. For instance, the pair corresponding to November 28, 1995 at 16 UT is (-0.040945 16), -0.040945 being the number of Julian centuries elapsed between Jan 1, 2000 at 12 UT and November 28, 1995 at 0 UT. SUNRISE-FLAG is passed @@ -444,7 +444,7 @@ to `solar-ecliptic-coordinates'." "Azimuth and height of the sun at TIME, LATITUDE, and LONGITUDE. TIME is a pair with the first component being the number of Julian centuries elapsed at 0 Universal Time, and the second -component being the universal time. For instance, the pair +component counting Universal Time hours. For instance, the pair corresponding to November 28, 1995 at 16 UT is (-0.040945 16), -0.040945 being the number of Julian centuries elapsed between Jan 1, 2000 at 12 UT and November 28, 1995 at 0 UT. SUNRISE-FLAG @@ -476,8 +476,8 @@ Sunrise if DIRECTION =-1 or sunset if =1 at LATITUDE, LONGITUDE, with midday being TIME. TIME is a pair with the first component being the number of Julian centuries -elapsed at 0 Universal Time, and the second component being the universal -time. For instance, the pair corresponding to November 28, 1995 at 16 UT is +elapsed at 0 Universal Time, and the second component counting Universal Time +hours. For instance, the pair corresponding to November 28, 1995 at 16 UT is \(-0.040945 16), -0.040945 being the number of Julian centuries elapsed between Jan 1, 2000 at 12 UT and November 28, 1995 at 0 UT. @@ -522,8 +522,8 @@ Uses binary search." Parameters are the midday TIME and the LATITUDE, LONGITUDE of the location. TIME is a pair with the first component being the number of Julian centuries -elapsed at 0 Universal Time, and the second component being the universal -time. For instance, the pair corresponding to November 28, 1995 at 16 UT is +elapsed at 0 Universal Time, and the second component counting Universal Time +hours. For instance, the pair corresponding to November 28, 1995 at 16 UT is \(-0.040945 16), -0.040945 being the number of Julian centuries elapsed between Jan 1, 2000 at 12 UT and November 28, 1995 at 0 UT. diff --git a/lisp/emacs-lisp/autoload.el b/lisp/emacs-lisp/autoload.el index 1b06fb6a51d..14e584df672 100644 --- a/lisp/emacs-lisp/autoload.el +++ b/lisp/emacs-lisp/autoload.el @@ -251,9 +251,22 @@ If a buffer is visiting the desired autoload file, return it." (enable-local-eval nil)) ;; We used to use `raw-text' to read this file, but this causes ;; problems when the file contains non-ASCII characters. - (let ((delay-mode-hooks t)) - (find-file-noselect - (autoload-ensure-default-file (autoload-generated-file)))))) + (let* ((delay-mode-hooks t) + (file (autoload-generated-file)) + (file-missing (not (file-exists-p file)))) + (when file-missing + (autoload-ensure-default-file file)) + (with-current-buffer + (find-file-noselect + (autoload-ensure-file-writeable + file)) + ;; block backups when the file has just been created, since + ;; the backups will just be the auto-generated headers. + ;; bug#23203 + (when file-missing + (setq buffer-backed-up t) + (save-buffer)) + (current-buffer))))) (defun autoload-generated-file () (expand-file-name generated-autoload-file @@ -374,21 +387,22 @@ not be relied upon." ;;;###autoload (put 'autoload-ensure-writable 'risky-local-variable t) +(defun autoload-ensure-file-writeable (file) + ;; Probably pointless, but replaces the old AUTOGEN_VCS in lisp/Makefile, + ;; which was designed to handle CVSREAD=1 and equivalent. + (and autoload-ensure-writable + (let ((modes (file-modes file))) + (if (zerop (logand modes #o0200)) + ;; Ignore any errors here, and let subsequent attempts + ;; to write the file raise any real error. + (ignore-errors (set-file-modes file (logior modes #o0200)))))) + file) + (defun autoload-ensure-default-file (file) "Make sure that the autoload file FILE exists, creating it if needed. If the file already exists and `autoload-ensure-writable' is non-nil, make it writable." - (if (file-exists-p file) - ;; Probably pointless, but replaces the old AUTOGEN_VCS in lisp/Makefile, - ;; which was designed to handle CVSREAD=1 and equivalent. - (and autoload-ensure-writable - (let ((modes (file-modes file))) - (if (zerop (logand modes #o0200)) - ;; Ignore any errors here, and let subsequent attempts - ;; to write the file raise any real error. - (ignore-errors (set-file-modes file (logior modes #o0200)))))) - (write-region (autoload-rubric file) nil file)) - file) + (write-region (autoload-rubric file) nil file)) (defun autoload-insert-section-header (outbuf autoloads load-name file time) "Insert the section-header line, diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el index ca475828642..94ebbdd60c7 100644 --- a/lisp/gnus/gnus-art.el +++ b/lisp/gnus/gnus-art.el @@ -1009,7 +1009,7 @@ on parts -- for instance, adding Vcard info to a database." (defcustom gnus-article-date-headers '(combined-lapsed) "A list of Date header formats to display. -Valid formats are `ut' (universal time), `local' (local time +Valid formats are `ut' (Universal Time), `local' (local time zone), `english' (readable English), `lapsed' (elapsed time), `combined-lapsed' (both the original date and the elapsed time), `original' (the original date header), `iso8601' (ISO8601 diff --git a/lisp/org/org.el b/lisp/org/org.el index d2b48a64e45..231daa9a6a7 100644 --- a/lisp/org/org.el +++ b/lisp/org/org.el @@ -22674,7 +22674,7 @@ time-range, if possible. The optional ZONE is omitted or nil for Emacs local time, t for Universal Time, `wall' for system wall clock time, or a string as in -`set-time-zone-rule' for a time zone rule." +the TZ environment variable." (format-time-string format (apply 'encode-time diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el index 9c8a88c80fc..82059c91363 100644 --- a/lisp/progmodes/project.el +++ b/lisp/progmodes/project.el @@ -162,7 +162,7 @@ end it with `/'. DIR must be one of `project-roots' or DIRS is a list of absolute directories; it should be some subset of the project roots and external roots. -The default implementation uses `find-program'. PROJECT is used +The default implementation uses `grep-find-program'. PROJECT is used to find the list of ignores for each directory." ;; FIXME: Uniquely abbreviate the roots? (require 'xref) @@ -171,7 +171,7 @@ to find the list of ignores for each directory." (lambda (dir) (let ((command (format "%s %s %s -type f -print0" - find-program + grep-find-program dir (xref--find-ignores-arguments (project-ignores project dir) diff --git a/lisp/vc/add-log.el b/lisp/vc/add-log.el index d6c1fc203db..58a4e77a602 100644 --- a/lisp/vc/add-log.el +++ b/lisp/vc/add-log.el @@ -583,10 +583,9 @@ Compatibility function for \\[next-error] invocations." ;; called add-log-time-zone-rule since it's only used from add-log-* code. (defvaralias 'change-log-time-zone-rule 'add-log-time-zone-rule) (defvar add-log-time-zone-rule nil - "Time zone used for calculating change log time stamps. -It takes the same format as the TZ argument of `set-time-zone-rule'. -If nil, use local time. -If t, use universal time.") + "Time zone rule used for calculating change log time stamps. +If nil, use local time. If t, use Universal Time. +If a string, interpret as the ZONE argument of `format-time-string'.") (put 'add-log-time-zone-rule 'safe-local-variable (lambda (x) (or (booleanp x) (stringp x)))) diff --git a/src/editfns.c b/src/editfns.c index a2d5673a257..70285e6d5db 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -1969,10 +1969,10 @@ DEFUN ("format-time-string", Fformat_time_string, Sformat_time_string, 1, 3, 0, doc: /* Use FORMAT-STRING to format the time TIME, or now if omitted. TIME is specified as (HIGH LOW USEC PSEC), as returned by `current-time' or `file-attributes'. The obsolete form (HIGH . LOW) -is also still accepted. -The optional ZONE is omitted or nil for Emacs local time, t for -Universal Time, `wall' for system wall clock time, or a string as in -`set-time-zone-rule' for a time zone rule. +is also still accepted. The optional ZONE is omitted or nil for Emacs +local time, t for Universal Time, `wall' for system wall clock time, +or a string as in the TZ environment variable. + The value is a copy of FORMAT-STRING, but with certain constructs replaced by text that describes the specified date and time in TIME: @@ -2087,7 +2087,7 @@ as from `current-time' and `file-attributes', or nil to use the current time. The obsolete form (HIGH . LOW) is also still accepted. The optional ZONE is omitted or nil for Emacs local time, t for Universal Time, `wall' for system wall clock time, or a string as in -`set-time-zone-rule' for a time zone rule. +the TZ environment variable. The list has the following nine members: SEC is an integer between 0 and 60; SEC is 60 for a leap second, which only some operating systems @@ -2152,9 +2152,9 @@ DEFUN ("encode-time", Fencode_time, Sencode_time, 6, MANY, 0, This is the reverse operation of `decode-time', which see. The optional ZONE is omitted or nil for Emacs local time, t for Universal Time, `wall' for system wall clock time, or a string as in -`set-time-zone-rule' for a time zone rule. It can also be a list (as -from `current-time-zone') or an integer (as from `decode-time') -applied without consideration for daylight saving time. +the TZ environment variable. It can also be a list (as from +`current-time-zone') or an integer (as from `decode-time') applied +without consideration for daylight saving time. You can pass more than 7 arguments; then the first six arguments are used as SECOND through YEAR, and the *last* argument is used as ZONE. @@ -2214,7 +2214,7 @@ but this is considered obsolete. The optional ZONE is omitted or nil for Emacs local time, t for Universal Time, `wall' for system wall clock time, or a string as in -`set-time-zone-rule' for a time zone rule. */) +the TZ environment variable. */) (Lisp_Object specified_time, Lisp_Object zone) { time_t value = lisp_seconds_argument (specified_time); @@ -2291,7 +2291,7 @@ instead of using the current time. The argument should have the form `current-time' and from `file-attributes'. SPECIFIED-TIME can also have the form (HIGH . LOW), but this is considered obsolete. Optional second arg ZONE is omitted or nil for the local time zone, or -a string as in `set-time-zone-rule'. +a string as in the TZ environment variable. Some operating systems cannot provide all this information to Emacs; in this case, `current-time-zone' returns a list containing nil for @@ -2332,8 +2332,11 @@ the data it can't find. */) DEFUN ("set-time-zone-rule", Fset_time_zone_rule, Sset_time_zone_rule, 1, 1, 0, doc: /* Set the Emacs local time zone using TZ, a string specifying a time zone rule. -If TZ is nil or `wall', use system wall clock time. If TZ is t, use -Universal Time. If TZ is an integer, treat it as in `encode-time'. + +If TZ is nil or `wall', use system wall clock time; this differs from +the usual Emacs convention where nil means current local time. If TZ +is t, use Universal Time. If TZ is an integer, treat it as in +`encode-time'. Instead of calling this function, you typically want something else. To temporarily use a different time zone rule for just one invocation diff --git a/src/macfont.m b/src/macfont.m index c9082a58415..04456283fa1 100644 --- a/src/macfont.m +++ b/src/macfont.m @@ -2373,9 +2373,9 @@ So we use CTFontDescriptorCreateMatchingFontDescriptor (no != (spacing >= FONT_SPACING_MONO))) continue; - /* Don't use a color bitmap font unless its family is - explicitly specified. */ - if ((sym_traits & kCTFontTraitColorGlyphs) && NILP (family)) + /* Don't use a color bitmap font until it is supported on + free platforms. */ + if (sym_traits & kCTFontTraitColorGlyphs) continue; if (j > 0