On 05/31/17 10:30 AM, Richard L. Hamilton wrote:

On May 31, 2017, at 13:01, Alan Coopersmith <alan.coopersm...@oracle.com> wrote:

On 05/31/17 09:43 AM, Richard L. Hamilton wrote:
The alternative would be a large times analog of large file support; why that 
wasn't done when 64-bit began, I don't understand. :-)

It was considered at Sun in the late 90's but discarded as going full LP64
already provided a solution without combinatorial explosion of test matrices
for large files x large times.  The large files API was created before LP64
was an option on most Unixes, including Solaris.


Testing, yes; that makes sense.

How are the time conversion functions doing with regard to time_t past 
INT32_MAX?  I see that (with a 64-bit executable) at least ctime() seems to 
work enough beyond for usual life and commercial purposes (aside from 
radioactive waste :-) ):

13:15:32[13]monster:/home/rlhamil> ./maxtime
time overflow after Tue Jan 19 03:14:07 2038
 in 32-bit signed two's complement
timestamp 9223372036854775807 (INT64_MAX) cannot be processed by ctime()
t=2147483647: Tue Jan 19 03:14:07 2038

t=4294967294: Sun Feb  7 06:28:14 2106

t=8589934588: Wed Mar 16 12:56:28 2242

t=17179869176: Wed May 30 01:52:56 2514

t=34359738352: Tue Oct 26 03:45:52 3058

t=68719476704: Sun Aug 20 07:31:44 4147

t=137438953408: Wed Apr  8 15:03:28 6325

t=274877906816: (null)

On Solaris, ctime() is defined as returning a string of exactly 26 characters,
so it gives up when the year requires a 5th digit and doesn't fit.

Converting to strftime and compiling with -std=c99 -m64 -D_XOPEN_SOURCE=700
gets a bit further here:

        for (t=INT32_MAX;t<=INT64_MAX && t>=0L;t<<=1) {
                char s[100] = "";
                struct tm *l = localtime(&t);
                if (l != NULL)
                        strftime(s, sizeof(s), "%a %b %e %H:%M:%S %Y", l);
                else
                        snprintf(s, sizeof(s), "localtime(%ld) == NULL", t);
                printf("t=%ld: %s\n", t, s);
        }

time overflow after Tue Jan 19 03:14:07 2038
 in 32-bit signed two's complement
timestamp 9223372036854775807 (INT64_MAX) cannot be processed by ctime()
t=2147483647: Tue Jan 19 03:14:07 2038
t=4294967294: Sun Feb  7 06:28:14 2106
t=8589934588: Wed Mar 16 12:56:28 2242
t=17179869176: Wed May 30 01:52:56 2514
t=34359738352: Tue Oct 26 03:45:52 3058
t=68719476704: Sun Aug 20 07:31:44 4147
t=137438953408: Wed Apr  8 15:03:28 6325
t=274877906816: Wed Jul 14 06:06:56 10680
t=549755813632: Tue Jan 25 12:13:52 19391
t=1099511627264: Mon Feb 20 00:27:44 36812
t=2199023254528: Fri Apr 10 00:55:28 71654
t=4398046509056: Sat Jul 19 01:50:56 141338
t=8796093018112: Mon Feb  4 03:41:52 280707
t=17592186036224: Fri Mar  8 07:23:44 559444
t=35184372072448: Sat May 14 14:47:28 1116918
t=70368744144896: Tue Sep 25 05:34:56 2231866
t=140737488289792: Sun Jun 19 11:09:52 4461763
t=281474976579584: Wed Dec  5 22:19:44 8921556
t=562949953159168: Wed Nov 10 20:39:28 17841143
t=1125899906318336: Wed Sep 19 17:18:56 35680317
t=2251799812636672: Wed Jun  7 10:37:52 71358665
t=4503599625273344: Tue Nov 11 21:15:44 142715360
t=9007199250546688: Mon Sep 24 18:31:28 285428751
t=18014398501093376: Sat Jun 17 13:02:56 570855533
t=36028797002186752: Tue Dec  1 02:05:52 1141709096
t=72057594004373504: localtime(72057594004373504) == NULL
t=144115188008747008: localtime(144115188008747008) == NULL
t=288230376017494016: localtime(288230376017494016) == NULL
t=576460752034988032: localtime(576460752034988032) == NULL
t=1152921504069976064: localtime(1152921504069976064) == NULL
t=2305843008139952128: localtime(2305843008139952128) == NULL
t=4611686016279904256: localtime(4611686016279904256) == NULL
t=9223372032559808512: localtime(9223372032559808512) == NULL

I suggest anyone working with such precise timestamps more than a billion years
in the future use a system more oriented towards such scientific calculations
than the C standard library.  I'm sure it's timezone code does not account for
the changes in the Earth's rotation nor the tectonic plate migration that will
have occurred over that timespan.

        -alan-

_______________________________________________
openindiana-discuss mailing list
openindiana-discuss@openindiana.org
https://openindiana.org/mailman/listinfo/openindiana-discuss

Reply via email to