|
|
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.