strftime: Add support for %s (seconds since epoch)
* libc/time/strftime.c (__strftime): add support for %s (seconds from Unix epoch). Fix whitespaces. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
cf51db8baa
commit
6090952296
|
@ -1,3 +1,8 @@
|
|||
2015-10-26 Brian Inglis <Brian.Inglis@SystematicSw.ab.ca>
|
||||
|
||||
* libc/time/strftime.c (__strftime): add support for %s (seconds from
|
||||
Unix epoch). Fix whitespaces.
|
||||
|
||||
2015-10-19 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* libc/include/sys/_intsup.h: Add support for 16-bit and 20-bit
|
||||
|
|
|
@ -166,6 +166,10 @@ notations, the result is an empty string. [tm_sec, tm_min, tm_hour]
|
|||
o %R
|
||||
The 24-hour time, to the minute. Equivalent to "%H:%M". [tm_min, tm_hour]
|
||||
|
||||
o %s
|
||||
The time elapsed, in seconds, since the start of the Unix epoch at
|
||||
1970-01-01 00:00:00 UTC.
|
||||
|
||||
o %S
|
||||
The second, formatted with two digits (from `<<00>>' to `<<60>>'). The
|
||||
value 60 accounts for the occasional leap second. [tm_sec]
|
||||
|
@ -1109,6 +1113,74 @@ recurse:
|
|||
tim_p->tm_hour, tim_p->tm_min);
|
||||
CHECK_LENGTH ();
|
||||
break;
|
||||
case CQ('s'):
|
||||
/*
|
||||
* From:
|
||||
* The Open Group Base Specifications Issue 7
|
||||
* IEEE Std 1003.1, 2013 Edition
|
||||
* Copyright (c) 2001-2013 The IEEE and The Open Group
|
||||
* XBD Base Definitions
|
||||
* 4. General Concepts
|
||||
* 4.15 Seconds Since the Epoch
|
||||
* A value that approximates the number of seconds that have elapsed since the
|
||||
* Epoch. A Coordinated Universal Time name (specified in terms of seconds
|
||||
* (tm_sec), minutes (tm_min), hours (tm_hour), days since January 1 of the year
|
||||
* (tm_yday), and calendar year minus 1900 (tm_year)) is related to a time
|
||||
* represented as seconds since the Epoch, according to the expression below.
|
||||
* If the year is <1970 or the value is negative, the relationship is undefined.
|
||||
* If the year is >=1970 and the value is non-negative, the value is related to a
|
||||
* Coordinated Universal Time name according to the C-language expression, where
|
||||
* tm_sec, tm_min, tm_hour, tm_yday, and tm_year are all integer types:
|
||||
* tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 +
|
||||
* (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 -
|
||||
* ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400
|
||||
* OR
|
||||
* ((((tm_year-69)/4 - (tm_year-1)/100 + (tm_year+299)/400 +
|
||||
* (tm_year-70)*365 + tm_yday)*24 + tm_hour)*60 + tm_min)*60 + tm_sec
|
||||
*/
|
||||
/* modified from %z case by hoisting offset outside if block and initializing */
|
||||
{
|
||||
long offset = 0; /* offset < 0 => W of GMT, > 0 => E of GMT:
|
||||
subtract to get UTC */
|
||||
|
||||
if (tim_p->tm_isdst >= 0)
|
||||
{
|
||||
TZ_LOCK;
|
||||
if (!tzset_called)
|
||||
{
|
||||
_tzset_unlocked ();
|
||||
tzset_called = 1;
|
||||
}
|
||||
|
||||
#if defined (__CYGWIN__)
|
||||
/* Cygwin must check if the application has been built with or
|
||||
without the extra tm members for backward compatibility, and
|
||||
then use either that or the old method fetching from tzinfo.
|
||||
Rather than pulling in the version check infrastructure, we
|
||||
just call a Cygwin function. */
|
||||
extern long __cygwin_gettzoffset (const struct tm *tmp);
|
||||
offset = __cygwin_gettzoffset (tim_p);
|
||||
#elif defined (__TM_GMTOFF)
|
||||
offset = tim_p->__TM_GMTOFF;
|
||||
#else
|
||||
__tzinfo_type *tz = __gettzinfo ();
|
||||
/* The sign of this is exactly opposite the envvar TZ. We
|
||||
could directly use the global _timezone for tm_isdst==0,
|
||||
but have to use __tzrule for daylight savings. */
|
||||
offset = -tz->__tzrule[tim_p->tm_isdst > 0].offset;
|
||||
#endif
|
||||
TZ_UNLOCK;
|
||||
}
|
||||
len = snprintf (&s[count], maxsize - count, CQ("%lld"),
|
||||
(((((long long)tim_p->tm_year - 69)/4
|
||||
- (tim_p->tm_year - 1)/100
|
||||
+ (tim_p->tm_year + 299)/400
|
||||
+ (tim_p->tm_year - 70)*365 + tim_p->tm_yday)*24
|
||||
+ tim_p->tm_hour)*60 + tim_p->tm_min)*60
|
||||
+ tim_p->tm_sec - offset);
|
||||
CHECK_LENGTH ();
|
||||
}
|
||||
break;
|
||||
case CQ('S'):
|
||||
#ifdef _WANT_C99_TIME_FORMATS
|
||||
if (alt != CQ('O') || !*alt_digits
|
||||
|
@ -1442,6 +1514,7 @@ const struct test Vec0[] = {
|
|||
{ CQ("%p"), 2+1, EXP(CQ("AM")) },
|
||||
{ CQ("%r"), 11+1, EXP(CQ("09:53:47 AM")) },
|
||||
{ CQ("%R"), 5+1, EXP(CQ("09:53")) },
|
||||
{ CQ("%s"), 2+1, EXP(CQ("1230648827")) },
|
||||
{ CQ("%S"), 2+1, EXP(CQ("47")) },
|
||||
{ CQ("%t"), 1+1, EXP(CQ("\t")) },
|
||||
{ CQ("%T"), 8+1, EXP(CQ("09:53:47")) },
|
||||
|
@ -1502,6 +1575,7 @@ const struct test Vec1[] = {
|
|||
{ CQ("%p"), 2+1, EXP(CQ("PM")) },
|
||||
{ CQ("%r"), 11+1, EXP(CQ("11:01:13 PM")) },
|
||||
{ CQ("%R"), 5+1, EXP(CQ("23:01")) },
|
||||
{ CQ("%s"), 2+1, EXP(CQ("1215054073")) },
|
||||
{ CQ("%S"), 2+1, EXP(CQ("13")) },
|
||||
{ CQ("%t"), 1+1, EXP(CQ("\t")) },
|
||||
{ CQ("%T"), 8+1, EXP(CQ("23:01:13")) },
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
What's new:
|
||||
-----------
|
||||
|
||||
- strftime(3) supports %s (seconds since Epoch) now.
|
||||
|
||||
- posix_madvise(POSIX_MADV_WILLNEED) now utilizes OS functionality available
|
||||
starting with Windows 8/Server 2012. Still a no-op on older systems.
|
||||
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2015-10-27 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* new-features.xml (ov-new2.3): Document strftime %s addition.
|
||||
|
||||
2015-10-22 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* posix.xml (std-iso): New section.
|
||||
|
|
|
@ -8,6 +8,10 @@
|
|||
|
||||
<itemizedlist mark="bullet">
|
||||
|
||||
<listitem><para>
|
||||
strftime(3) supports %s (seconds since Epoch) now.
|
||||
</para></listitem>
|
||||
|
||||
<listitem><para>
|
||||
posix_madvise(POSIX_MADV_WILLNEED) now utilizes OS functionality available
|
||||
starting with Windows 8/Server 2012.
|
||||
|
|
Loading…
Reference in New Issue