More Document Number: N2833 
        Submitter: Aaron Peter
          Bachmann 
        Submission Date: 2021-10-07 
      Add timegm() as non-optional part of <time.h>
        to C2X
      
For the local time we have localtime()
        and localtime_r()  to convert from time_t
        to struct tm and mktime() to convert
        back. For UTC we have gmtime() and gmtime_r()
        to convert from time_t to struct tm
        but the function to convert struct tm to UTC is
        missing from the C-Standard. This paper proposes the addition of
        the function time_t timegm(struct tm *timeptr) to
        fill the gap.
timegm() has its origin in BSD. _mkgmtime(). Several proposals (N2337
          [1], N2417
          [2], N2459
          [3]) to improve and extend the  time-related functions
          are already incorporated into the working draft N2596
          [4].UTC is often used since UTC is unique around the world. The use
        of UTC is especially desirable if systems are spanning multiple
        time-zones or devices move from one time-zone to another. In
        addition when UTC is used there are fewer configuration issues.
        Existing protocols, configuration-files and user interfaces and
        (peripheral) devices (e. g. realtime-clocks) often utilize
        broken down times. Implementing and testing timegm()
        over and over again or alternatively locating  a
        implementation and verifying the code and its licence over and
        over again is a waste of development-time. Temporarily changing
        the timezone and using mktime() is bad, since it
        introduces a race-condition. It has a low implementation burden
        once you have the source of mktime(). Thus timegm()
        shall be defined by the C-standard. 
      
The changes given here are relative to N2596 [4].
After
      
      7.27.2.3 The mktime function
      
      ...
      
      add
      
       7.27.2.4 The timegm function
        
        Synopsis
        #include
        <time.h>
                time_t timegm(struct
        tm *timeptr);
Description
         The timegm function converts the broken-down time,
        expressed as UTC time, in the structure pointed to by timeptr
        into a calendar time value with the same encoding as that of the
        values returned by the time function. The original values of the
        tm_wday and tm_yday components of the structure are ignored, and
        the original values of the other components are not restricted
        to the ranges indicated above. On successful completion, the
        values of the tm_wday and tm_yday components of the structure
        are set appropriately, and the other components are set to
        represent the specified calendar time, but with their values
        forced to the ranges indicated above; the final value of tm_mday
        is not set until tm_mon and tm_year are determined.
Returns
      
The mktime function returns the specified
        calendar time encoded as a value of type time_t. If the calendar
        time cannot be represented, the function returns the value
        (time_t)(−1).
      
Description
        The timegm function is identical to mktime except that it always
        takes the input values to be Coordinated Universal Time (UTC)
        regardless of any local time zone setting.
      
and
    
In B.26 Date and time <time.h>
    
after
time_t mktime(struct tm *timeptr);
    
insert:
time_t timegm(struct tm *timeptr);
      
      Additional Questions:
Do we want to change the signatures to
       and 
        time_t mktime(const struct tm *timeptr)
      time_t gmtime(const struct tm *timeptr) ? 
This might bring us in conflict with POSIX.
       
[1] N2337
        2019/02/03 Stoughton, Proposal To Add Extended Month Name
        Formats to strftime()
    
[2] N2417
        2019/09/08 Gustedt, Modernize time.h functions v.2x 
    
[3] N2459
        2019/11/18 Gustedt, Add an interface to query resolution of time
        bases v3
    
[4] N2596
        2020/12/12 Meneide, C2x Working Draft
    
[5] Sandra
        Loosemore et alt., The GNU C Library Reference Manual