|
|
1.1 ! root 1: .de L \" literal font ! 2: .ft 5 ! 3: .it 1 }N ! 4: .if !\\$1 \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 ! 5: .. ! 6: .de LR ! 7: .}S 5 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" ! 8: .. ! 9: .de RL ! 10: .}S 1 5 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" ! 11: .. ! 12: .de EX \" start example ! 13: .ta 1i 2i 3i 4i 5i 6i ! 14: .PP ! 15: .RS ! 16: .PD 0 ! 17: .ft 5 ! 18: .nf ! 19: .. ! 20: .de EE \" end example ! 21: .fi ! 22: .ft ! 23: .PD ! 24: .RE ! 25: .PP ! 26: .. ! 27: .TH TM 3 ! 28: .SH NAME ! 29: tm \- time conversion support ! 30: .SH SYNOPSIS ! 31: .L "#include <tm.h>" ! 32: .SH DESCRIPTION ! 33: The ! 34: .I tm ! 35: library supports conversion between ! 36: string date specifications, ! 37: .L time_t ! 38: clock values and ! 39: .L "struct tm" ! 40: values. ! 41: .L localtime() ! 42: and ! 43: .L gmtime() ! 44: (see ! 45: .IR ctime (3)) ! 46: are used to determine local time zone information. ! 47: .PP ! 48: .L time_t ! 49: values are the number of seconds since the epoch, ! 50: .BR "Jan 1 00:00:00 GMT 1970" , ! 51: with leap seconds omitted. ! 52: .PP ! 53: The global variable ! 54: .L "int tm_info.flags" ! 55: contains flags that allow all programs using the library ! 56: to be controlled in a consistent manner. ! 57: .L tm_info.flags ! 58: is initialized by the ! 59: .L tminit() ! 60: routine described below, and may be explicitly reset after ! 61: .L tminit() ! 62: is called. ! 63: The flags are: ! 64: .TP ! 65: .L TM_ADJUST ! 66: Set by ! 67: .L tminit() ! 68: if ! 69: .L localtime() ! 70: and ! 71: .L gmtime() ! 72: do not compensate for leap seconds. ! 73: .TP ! 74: .L TM_LEAP ! 75: .L time_t ! 76: values are interpreted as if they include leap seconds. ! 77: Set by ! 78: .L tminit() ! 79: if the ! 80: .L leap ! 81: option is set in the ! 82: .L TM_OPTIONS ! 83: environment variable. ! 84: .TP ! 85: .L TM_UTC ! 86: Times are relative to ! 87: .B UTC ! 88: (universal coordinated time, i.e., ! 89: .BR GMT ). ! 90: Otherwise times are relative to the local time zone. ! 91: Set by ! 92: .L tminit() ! 93: if the time zone name matches one of ! 94: .L tm_info.format[43] ! 95: through ! 96: .L tm_info.format[46] ! 97: described below. ! 98: If the time zone name is not determined by ! 99: .L localtime() ! 100: then the environment variables ! 101: .L TZNAME ! 102: (as described in BSD 4.3) and ! 103: .L TZ ! 104: (as described in System V) ! 105: are checked, in order. ! 106: If this fails then the time zone name is constructed using ! 107: the local time zone offset. ! 108: .PP ! 109: The routines are: ! 110: .TP ! 111: .L "time_t tmdate(char* date, char** end, time_t* clock)" ! 112: Parses the date specification ! 113: .L date ! 114: using the ! 115: .L tm_info.format ! 116: string table (described below) ! 117: and returns the equivalent ! 118: .L time_t ! 119: value. ! 120: If ! 121: .RL non- NULL , ! 122: .L end ! 123: is set to the position of the first unrecognized character in ! 124: .LR date . ! 125: .L clock ! 126: is used to provide default values for omitted components in ! 127: .LR date . ! 128: If ! 129: .L clock ! 130: is ! 131: .L NULL ! 132: then the current time is used. ! 133: .TP ! 134: .L "struct tm* tmfix(struct tm* tp)" ! 135: Corrects any out of bounds fields in ! 136: .L tp ! 137: and returns ! 138: .L tp ! 139: as its value. ! 140: The corrections start with ! 141: .L tp->tm_sec ! 142: and propagate down to ! 143: .LR tp->tm_year . ! 144: For example, if ! 145: .L tp->tm_sec ! 146: were 61 then it would change to 1 and ! 147: .L tp->tm_min ! 148: would be incremented by 1, and so on. ! 149: .LR tp->tm_wday , ! 150: .LR tp->tm_yday ! 151: and ! 152: .L tp->tm_isdst ! 153: are not changed as these can be computed from the other fields. ! 154: .TP ! 155: .L "char* tmform(char* buf, char* format, time_t* clock)" ! 156: Formats the date pointed to by ! 157: .L clock ! 158: into the buffer ! 159: .L buf ! 160: according to the format specification ! 161: .LR format . ! 162: If ! 163: .L format ! 164: is ! 165: .L NULL ! 166: or empty then the string ! 167: .L tm_info.format[40] ! 168: is used. ! 169: If ! 170: .L clock ! 171: is ! 172: .L NULL ! 173: then the current time is used. ! 174: A pointer to the end of ! 175: .L buf ! 176: (i.e., the terminating ! 177: .LR "'\e0'" ) ! 178: is returned. ! 179: .RS ! 180: .PP ! 181: .L format ! 182: is in the style of ! 183: .IR printf (3), ! 184: where ! 185: .BI % field ! 186: causes the corresponding fixed size field to be placed in ! 187: .LR buf , ! 188: zero padded if necessary, and \e\fIc\fP and \e\fInnn\fP ! 189: sequences are interpreted as in the C language. ! 190: Otherwise invalid ! 191: .BI % field ! 192: specifications and all other characters in ! 193: .L format ! 194: are copied into ! 195: .L buf ! 196: without change. ! 197: String field values are taken from the ! 198: .L tm_info.format ! 199: string table. ! 200: The ! 201: .I fields ! 202: are: ! 203: .TP ! 204: .PD 0 ! 205: .B % ! 206: .B % ! 207: character. ! 208: .TP ! 209: .B a ! 210: Abbreviated weekday name. ! 211: .TP ! 212: .B A ! 213: Full weekday name. ! 214: .TP ! 215: .B b ! 216: Abbreviated month name. ! 217: .TP ! 218: .B c ! 219: .IR ctime (3) ! 220: style date without the trailing ! 221: .BR newline . ! 222: .TP ! 223: .B C ! 224: .IR date (1) ! 225: style date. ! 226: .TP ! 227: .B d ! 228: Day of month number. ! 229: .TP ! 230: .B D ! 231: Date as ! 232: .IR mm / dd / yy . ! 233: .TP ! 234: .B e ! 235: Blank padded day of month number. ! 236: .TP ! 237: .B E ! 238: Unpadded day of month number. ! 239: .TP ! 240: .B h ! 241: Abbreviated month name. ! 242: .TP ! 243: .B H ! 244: 24-hour clock hour. ! 245: .TP ! 246: .B i ! 247: International ! 248: .IR date (1) ! 249: date that includes the time zone type name. ! 250: .TP ! 251: .B I ! 252: 12-hour clock hour. ! 253: .TP ! 254: .B j ! 255: 1-offset Julian date. ! 256: .TP ! 257: .B J ! 258: 0-offset Julian date. ! 259: .TP ! 260: .B l ! 261: .IR ls (1) ! 262: .B \-l ! 263: date that lists recent dates with ! 264: .IR hh : mm ! 265: and distant dates with ! 266: .IR yyyy . ! 267: .TP ! 268: .B m ! 269: Month number. ! 270: .TP ! 271: .B M ! 272: Minutes. ! 273: .TP ! 274: .B n ! 275: .B newline ! 276: character. ! 277: .TP ! 278: .B p ! 279: Meridian (e.g., ! 280: .B AM ! 281: or ! 282: .BR PM ). ! 283: .TP ! 284: .B r ! 285: 12-hour time as ! 286: .IR hh : mm : ss ! 287: .IR meridian . ! 288: .TP ! 289: .B R ! 290: 24-hour time as ! 291: .IR hh : mm . ! 292: .TP ! 293: .B S ! 294: Seconds. ! 295: .TP ! 296: .B t ! 297: .B tab ! 298: character. ! 299: .TP ! 300: .B T ! 301: 24-hour time as ! 302: .IR hh : mm : ss . ! 303: .TP ! 304: .B U ! 305: Week number with Sunday as the first day. ! 306: .TP ! 307: .B w ! 308: Weekday number. ! 309: .TP ! 310: .B W ! 311: Week number with Monday as the first day. ! 312: .TP ! 313: .B x ! 314: Local date style, using ! 315: .LR tm_info.format[39] , ! 316: that includes the month, day and year. ! 317: .TP ! 318: .B X ! 319: Local time style, using ! 320: .LR tm_info.format[38] , ! 321: that includes the hours and minutes. ! 322: .TP ! 323: .B y ! 324: 2-digit year. ! 325: .TP ! 326: .B Y ! 327: 4-digit year. ! 328: .TP ! 329: .B z ! 330: Time zone type name. ! 331: .TP ! 332: .B Z ! 333: Time zone name. ! 334: .TP ! 335: .BI + flag ! 336: .TP ! 337: .BI \- flag ! 338: Temporarily (until ! 339: .L tmform() ! 340: returns) sets (+) or clears (\-) the ! 341: .L tm_info.flags ! 342: flags specified by ! 343: .IR flag : ! 344: .RS ! 345: .TP ! 346: .B l ! 347: .L TM_LEAP ! 348: .TP ! 349: .B u ! 350: .L TM_UTC ! 351: .RE ! 352: .TP ! 353: .B # ! 354: Number of seconds since the epoch. ! 355: .PD ! 356: .RE ! 357: .TP ! 358: .L "void tminit()" ! 359: Implicitly called by the other ! 360: .I tm ! 361: library routines to initialize global data, including the ! 362: .L tm_info.format ! 363: table and the ! 364: .L tm_info.flags ! 365: global flags. ! 366: Global data should only be modified after an explicit call to ! 367: .LR tminit() . ! 368: .TP ! 369: .L "time_t tmleap(time_t* clock)" ! 370: Returns a ! 371: .L time_t ! 372: value for the time pointed to by ! 373: .L clock ! 374: with leap seconds adjusted for external ! 375: routines that do not handle leap seconds. ! 376: If ! 377: .L clock ! 378: is ! 379: .L NULL ! 380: then the current time is used. ! 381: Adjustments are only done if the ! 382: .L TM_ADJUST ! 383: flag is set in ! 384: .LR tm_info.flags . ! 385: .TP ! 386: .L "struct tm* tmmake(time_t* clock)" ! 387: Returns a pointer to the ! 388: .L tm ! 389: struct corresponding to the time pointed to by ! 390: .LR clock . ! 391: If ! 392: .L clock ! 393: is ! 394: .L NULL ! 395: then the current time is used. ! 396: .TP ! 397: .L "time_t tmtime(struct tm* tp, int west)" ! 398: Returns the ! 399: .L time_t ! 400: value corresponding to ! 401: .LR tp . ! 402: If ! 403: .L west ! 404: is ! 405: .L TM_LOCALZONE ! 406: then ! 407: .L tm ! 408: is relative to the local time zone, ! 409: otherwise ! 410: .L west ! 411: is the number of minutes west of ! 412: .B UTC ! 413: with daylight savings time taken into account. ! 414: .LR tp->tm_wday , ! 415: .LR tp->tm_yday ! 416: and ! 417: .L tp->tm_isdst ! 418: are ignored in the conversion. ! 419: .PP ! 420: The library routines use a table of date strings pointed to by ! 421: .LR "char** tm_info.format" . ! 422: The indices in ! 423: .L tm_info.format ! 424: are fixed by category. ! 425: .L tm_info.format ! 426: may be changed to point to other tables ! 427: according to local language and date conventions. ! 428: The contents by index (showing the USA English values) are: ! 429: .RS ! 430: .TP ! 431: .PD 0 ! 432: .B 0-11 ! 433: 3-character abbreviated month names. ! 434: .TP ! 435: .B 12-23 ! 436: Full month names. ! 437: .TP ! 438: .B 24-30 ! 439: 3-character abbreviated weekday names. ! 440: .TP ! 441: .B 31-37 ! 442: Full weekday names. ! 443: .TP ! 444: .B 38 ! 445: .L tmform() ! 446: local time format used by the ! 447: .B %X ! 448: field. ! 449: .TP ! 450: .B 39 ! 451: .L tmform() ! 452: local date format used by the ! 453: .B %x ! 454: field. ! 455: .TP ! 456: .B 40 ! 457: .L tmform() ! 458: format used if the ! 459: .L format ! 460: argument is ! 461: .L NULL ! 462: or empty. ! 463: .TP ! 464: .B 41-42 ! 465: Meridian names: AM, PM. ! 466: .TP ! 467: .B 43-46 ! 468: .B UTC ! 469: time zone names: GMT, UTC, UCT, CUT. ! 470: .TP ! 471: .B 47-50 ! 472: Daylight savings time suffix names: DST. ! 473: .TP ! 474: .B 51-54 ! 475: Suffixes to be ignored when matching strings in ! 476: .LR tmform() . ! 477: .TP ! 478: .B 55-61 ! 479: Time part names: second, hour, minute, day, week, month, year. ! 480: .TP ! 481: .B 62-65 ! 482: Hours of the day names: midnight, morning, noon, evening. ! 483: .TP ! 484: .B 66-68 ! 485: Relative day names: yesterday, today, tomorrow. ! 486: .TP ! 487: .B 69-71 ! 488: Past relative time references: last, ago, past. ! 489: .TP ! 490: .B 72-75 ! 491: Current relative time references: this, now, current. ! 492: .TP ! 493: .B 75-77 ! 494: Future relative time references: next, hence, coming. ! 495: .TP ! 496: .B 78-80 ! 497: Exact relative time references: exactly. ! 498: .TP ! 499: .B 81-85 ! 500: Noise words to be ignored: at, in, on. ! 501: .PD ! 502: .RE ! 503: .PP ! 504: Low level support functions and data are described in ! 505: .LR <tm.h> . ! 506: .SH EXAMPLES ! 507: .EX ! 508: #include <tm.h> ! 509: main() { ! 510: int i; ! 511: time_t t; ! 512: char buf[128]; ! 513: struct { ! 514: char* date; ! 515: char* format; ! 516: } x[] = { ! 517: "now", "%i", ! 518: "2 months ago", "%C", ! 519: "this Wednesday noon", "%x %I:%M %p", ! 520: "last December 25", "%A", ! 521: 0, 0 ! 522: }; ! 523: for (i = 0; x[i].date; i++) { ! 524: t = tmdate(x[i].date, (char*)0, (time_t*)0); ! 525: (void)tmform(buf, x[i].format, &t); ! 526: puts(buf); ! 527: } ! 528: } ! 529: .EE ! 530: produces ! 531: .EX ! 532: Fri Sep 30 12:10:14 USA EDT 1988 ! 533: Fri Jul 1 00:00:00 EDT 1988 ! 534: 10/05/88 12:00 PM ! 535: Friday ! 536: .EE ! 537: .SH "SEE ALSO" ! 538: date(1), time(2), ctime(3) ! 539: .SH BUGS ! 540: .L "struct tm" ! 541: values may get clobbered by the ! 542: .I tm ! 543: library routines as the ! 544: .IR ctime (3) ! 545: routines typically return pointers to a single static ! 546: .L "struct tm" ! 547: area. ! 548: .L tmdate() ! 549: uses an internal international time zone name table that will ! 550: probably always be incomplete.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.