getdate, getdate_r - dzielą tekstową datę z czasem na
osobne pola
Standardowa biblioteka C (
libc,
-lc)
#include <time.h>
struct tm *getdate(const char *string);
extern int getdate_err;
int getdate_r(const char *restrict string, struct tm *restrict res);
getdate():
_XOPEN_SOURCE >= 500
getdate_r():
_GNU_SOURCE
Funkcja
getdate() przekształca tekstową
reprezentację daty i czasu, przekazaną w buforze wskazywanym
przez
string, na osobne pola zawierające rozłożony
czas. Ten rozłożony czas jest przechowywany w strukturze
tm, do której wskaźnik jest zwracany jako wynik funkcji.
Zwracana struktura
tm może się znajdować w
pamięci statycznej, wobec czego zostanie nadpisana przez kolejne
wywołania funkcji
getdate().
W odróżnieniu od
strptime(3) (która przyjmuje
argument
format),
getdate() posługuje się
formatami znajdującymi się w pliku, do którego
pełna ścieżka jest podana w zmiennej środowiskowej
DATEMSK. Do konwersji stosowana jest pierwsza z linii pliku,
która pasuje do zadanego łańcucha.
Podczas dopasowywania ignorowana jest wielkość liter. Ignorowane
są również nadmiarowe białe znaki, zarówno
we wzorcu, jak i w przekształcanym łańcuchu.
Specyfikacje przekształceń, które mogą być
zawarte we wzorcu są takie same, jak dla
strptime(3). Jedna
dodatkowa specyfikacja przekształcenia jest opisana w standardzie
POSIX.1-2001:
- %Z
- Nazwa strefy czasowej. Glibc tego nie implementuje.
Gdy podano
%Z, to struktura zawierająca rozłożony
czas jest inicjowana wartościami odpowiadającymi
bieżącemu czasowi w podanej strefie czasowej. W przeciwnym
przypadku, jest inicjowana jako rozłożony czas
odpowiadający bieżącemu czasowi lokalnemu (tak jak w
przypadku wywołania funkcji
localtime(3)).
Gdy podany jest tylko dzień tygodnia, brany jest pierwszy taki
dzień przypadający w dniu bieżącym lub
później.
Gdy podany jest jedynie miesiąc (bez roku), brany jest pierwszy taki
miesiąc przypadający w miesiącu bieżącym
lub po nim. Gdy nie podano dnia, brany jest pierwszy dzień
miesiąca.
When no hour, minute, and second are given, the current hour, minute, and second
are taken.
Gdy nie podano daty, ale znana jest godzina, brana jest pierwsza taka godzina
przypadająca w bieżącej godzinie lub
później.
getdate_r() jest rozszerzeniem GNU. Jest to bezpieczna dla
wątków wersja
getdate(), która zamiast
używać globalnej zmiennej do raportowania
błędów oraz statycznego bufora na rozłożony
czas, zwraca błędy jako wynik funkcji oraz zwraca
rozłożony czas w zaalokowanej przez funkcję
wywołującą strukturze wskazywanej przez argument
res.
Po pomyślnym zakończeniu
getdate() zwraca wskaźnik
do struktury
struct tm. W przeciwnym razie zwraca NULL i ustawia
zmienną globalną
getdate_err na jeden z poniżej
podanych numerów błędów. Zmiany
errno nie
są określone.
W przypadku powodzenia
getdate_r() zwraca zero. W przeciwnym wypadku
zwraca jeden z poniżej podanych numerów
błędów.
Poniższe błędy są zwracane albo poprzez
getdate_err (w przypadku
getdate()), albo jako wynik funkcji (w
przypadku
getdate_r()):
- 1
- Zmienna środowiska DATEMSK nie jest
zdefiniowana lub ma pustą wartość.
- 2
- Nie udało się otworzyć pliku
wzorców określonego przez DATEMSK w trybie do
odczytu.
- 3
- Nie udało się pobrać informacji o
stanie.
- 4
- Plik wzorców nie jest zwykłym plikiem.
- 5
- Wystąpił błąd podczas odczytu
pliku wzorców.
- 6
- Nie udało się przydzielić
pamięci (brak dostępnej pamięci).
- 7
- Brak w pliku linii pasującej do podanych
danych.
- 8
- Niewłaściwa specyfikacja
wejściowa.
- DATEMSK
- Plik zawierający wzorce formatów.
-
TZ, LC_TIME
- Zmienne używane przez strptime(3).
Informacje o pojęciach używanych w tym rozdziale można
znaleźć w podręczniku
attributes(7).
Interfejs |
Atrybut |
Wartość |
getdate() |
Bezpieczeństwo wątkowe |
MT-Unsafe race:getdate env locale |
getdate_r() |
Bezpieczeństwo wątkowe |
MT-Safe env locale |
POSIX.1-2001, POSIX.1-2008.
Standard POSIX.1 dla
strptime(3) zawiera specyfikacje
przekształceń korzystające z modyfikatorów
%E lub
%O, podczas gdy takie specyfikacje nie zostały
podane dla
getdate(). Implementacja w glibc realizuje
getdate()
za pomocą
strptime(3), więc automatycznie obie funkcje
wspierają te same specyfikacje przekształceń.
Poniższy program wywołuje
getdate() dla każdego z
argumentów linii poleceń i po każdym takim
wywołaniu wyświetla wartości pól zwróconej
struktury
tm. Następująca sesja powłoki obrazuje
działanie programu:
$ TFILE=$PWD/tfile
$ echo '%A' > $TFILE # Full name of the day of the week
$ echo '%T' >> $TFILE # Time (HH:MM:SS)
$ echo '%F' >> $TFILE # ISO date (YYYY-MM-DD)
$ date
$ export DATEMSK=$TFILE
$ ./a.out Tuesday '2009-12-28' '12:22:33'
Sun Sep 7 06:03:36 CEST 2008
Call 1 ("Tuesday") succeeded:
tm_sec = 36
tm_min = 3
tm_hour = 6
tm_mday = 9
tm_mon = 8
tm_year = 108
tm_wday = 2
tm_yday = 252
tm_isdst = 1
Call 2 ("2009-12-28") succeeded:
tm_sec = 36
tm_min = 3
tm_hour = 6
tm_mday = 28
tm_mon = 11
tm_year = 109
tm_wday = 1
tm_yday = 361
tm_isdst = 0
Call 3 ("12:22:33") succeeded:
tm_sec = 33
tm_min = 22
tm_hour = 12
tm_mday = 7
tm_mon = 8
tm_year = 108
tm_wday = 0
tm_yday = 250
tm_isdst = 1
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int
main(int argc, char *argv[])
{
struct tm *tmp;
for (size_t j = 1; j < argc; j++) {
tmp = getdate(argv[j]);
if (tmp == NULL) {
printf("Call %zu failed; getdate_err = %d\n",
j, getdate_err);
continue;
}
printf("Call %zu (\"%s\") succeeded:\n", j, argv[j]);
printf(" tm_sec = %d\n", tmp->tm_sec);
printf(" tm_min = %d\n", tmp->tm_min);
printf(" tm_hour = %d\n", tmp->tm_hour);
printf(" tm_mday = %d\n", tmp->tm_mday);
printf(" tm_mon = %d\n", tmp->tm_mon);
printf(" tm_year = %d\n", tmp->tm_year);
printf(" tm_wday = %d\n", tmp->tm_wday);
printf(" tm_yday = %d\n", tmp->tm_yday);
printf(" tm_isdst = %d\n", tmp->tm_isdst);
}
exit(EXIT_SUCCESS);
}
time(2),
localtime(3),
setlocale(3),
strftime(3),
strptime(3)
Autorami polskiego tłumaczenia niniejszej strony podręcznika
są: Andrzej Krzysztofowicz <
[email protected]> i Robert
Luberda <
[email protected]>
Niniejsze tłumaczenie jest wolną dokumentacją.
Bliższe informacje o warunkach licencji można uzyskać
zapoznając się z
GNU
General Public License w wersji 3 lub nowszej. Nie przyjmuje się
ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy
zgłaszać na adres listy dyskusyjnej
[email protected]