| Путь: Toys/POSIX, команды версии: Ver.4 Ver.9 date
Комментарии в файле date.c : usage: date [-u] [-I RES] [-r FILE] [-d DATE] [+DISPLAY_FORMAT] [-D SET_FORMAT] [SET]
Установить/получить текущую дату/время. Без SET показывает текущую дату.
-d Показать DATE вместо текущего времени (преобразовать формат даты)
-D +FORMAT для SET или -d (вместо MMDDhhmm[[CC]YY][.ss])
-I RES ISO 8601 с RESolution d=date/h=hours/m=minutes/ s=seconds/n=ns
-r Использовать время модификации ФАЙЛА вместо текущей даты
-s DATE Установить системные часы на DATE.
-u Используйте UTC вместо текущего часового пояса
Поддерживаемые форматы ввода:
ММДДччмм[[CC]ГГ][.ss] POSIX
@UNIXTIME[.FRACTION] секунд с полуночи 1 января 1970 г.
ГГГГ-ММ-ДД [чч:мм[:сс]] ISO 8601
чч:мм[:сс] 24-часовое время сегодня
За всеми входными форматами могут следовать доли секунды и/или UTC.
смещение, такое как -0800.
Перед всеми форматами ввода может стоять TZ="id" для установки часового пояса ввода.
отдельно от выходного часового пояса. В противном случае $TZ устанавливает оба значения.
+FORMAT указывает строку формата отображения, используя синтаксис strftime(3):
%% литерал % %n новая строка %t вкладка
%S секунд (00-60) %M минут (00-59) %m месяцев (01-12)
%H час (0-23) %I час (01-12) %p AM/PM
%y короткий год (00-99) %Y год %C век
%краткое название дня недели %название дня недели %u день недели (1-7, 1=пон)
%b краткое название месяца %B название месяца %Z название часового пояса
%j день года (001-366) %d день месяца (01-31) %e день месяца ( 1-31)
%N наносек (только вывод)
%U Неделя года (0-53 начало воскресенья) %W Неделя года (0-53 начало понедельник)
%V неделя года (1-53 начало понедельник, неделя < 4 дней не часть этого года)
%F "%Y-%m-%d" %R "%H:%M" %T "%H:%M:%S" %z часовой пояс (-0800)
%D "%m/%d/%y" %r "%I:%M:%S %p" %h "%b" %:z часовой пояс (-08:00)
%x локаль дата %X локаль время %c локаль дата/время %s время эпохи unix
usage: date [-u] [-I RES] [-r FILE] [-d DATE] [+DISPLAY_FORMAT] [-D SET_FORMAT] [SET]
Set/get the current date/time. With no SET shows the current date.
-d Show DATE instead of current time (convert date format)
-D +FORMAT for SET or -d (instead of MMDDhhmm[[CC]YY][.ss])
-I RES ISO 8601 with RESolution d=date/h=hours/m=minutes/s=seconds/n=ns
-r Use modification time of FILE instead of current date
-s DATE Set the system clock to DATE.
-u Use UTC instead of current timezone
Supported input formats:
MMDDhhmm[[CC]YY][.ss] POSIX
@UNIXTIME[.FRACTION] seconds since midnight 1970-01-01
YYYY-MM-DD [hh:mm[:ss]] ISO 8601
hh:mm[:ss] 24-hour time today
All input formats can be followed by fractional seconds, and/or a UTC
offset such as -0800.
All input formats can be preceded by TZ="id" to set the input time zone
separately from the output time zone. Otherwise $TZ sets both.
+FORMAT specifies display format string using strftime(3) syntax:
%% literal % %n newline %t tab
%S seconds (00-60) %M minute (00-59) %m month (01-12)
%H hour (0-23) %I hour (01-12) %p AM/PM
%y short year (00-99) %Y year %C century
%a short weekday name %A weekday name %u day of week (1-7, 1=mon)
%b short month name %B month name %Z timezone name
%j day of year (001-366) %d day of month (01-31) %e day of month ( 1-31)
%N nanosec (output only)
%U Week of year (0-53 start Sunday) %W Week of year (0-53 start Monday)
%V Week of year (1-53 start Monday, week < 4 days not part of this year)
%F "%Y-%m-%d" %R "%H:%M" %T "%H:%M:%S" %z timezone (-0800)
%D "%m/%d/%y" %r "%I:%M:%S %p" %h "%b" %:z timezone (-08:00)
%x locale date %X locale time %c locale date/time %s unix epoch time
Исходный текст в файле date.c #define FOR_date
#include "toys.h"
GLOBALS(
char *s, *r, *I, *D, *d;
unsigned nano;
)
// Handles any leading `TZ="blah" ` in the input string.
static void parse_date(char *str, time_t *t)
{
char *new_tz = NULL, *old_tz, *s = str;
if (!strncmp(str, "TZ=\"", 4)) {
// Extract the time zone and skip any whitespace.
new_tz = str+4;
if (!(str = strchr(new_tz, '"'))) xvali_date(0, s);
*str++ = 0;
while (isspace(*str)) str++;
// Switch $TZ.
old_tz = getenv("TZ");
setenv("TZ", new_tz, 1);
tzset();
}
time(t);
xparsedate(str, t, &TT.nano, 1);
if (new_tz) {
if (old_tz) setenv("TZ", old_tz, 1);
else unsetenv("TZ");
}
}
// Print strftime plus %N and %:z escape(s). Note: modifies fmt in those cases.
static void puts_time(char *fmt, struct tm *tm)
{
char *s, *snap, *out;
for (s = fmt;;s++) {
long n = 0;
// Find next %N/%:z or end of format string.
if (*(snap = s)) {
if (*s != '%') continue;
if (*++s == 'N') n = 9;
else if (isdigit(*s) && s[1] == 'N') n = *s++-'0';
else if (*s == ':' && s[1] == 'z') s++, n++;
else continue;
}
// Only modify input string if needed (default format is constant string).
if (*s) *snap = 0;
// Do we have any regular work for strftime to do?
out = toybuf;
if (*fmt) {
if (!strftime(out, sizeof(toybuf)-12, fmt, tm))
perror_exit("bad format '%s'", fmt);
out += strlen(out);
}
// Do we have any custom formatting to append to that?
if (*s == 'N') {
sprintf(out, "%09u", TT.nano);
out[n] = 0;
} else if (*s == 'z') {
strftime(out, 10, "%z", tm);
memmove(out+4, out+3, strlen(out+3)+1);
out[3] = ':';
}
xputsn(toybuf);
if (!*s || !*(fmt = s+1)) break;
}
xputc('\n');
}
void date_main(void)
{
char *setdate = *toys.optargs, *format_string = "%a %b %e %H:%M:%S %Z %Y",
*tz = NULL;
time_t t;
if (FLAG(I)) {
char *iso_formats[] = {"%F","%FT%H%:z","%FT%R%:z","%FT%T%:z","%FT%T,%N%:z"};
int i = stridx("dhmsn", (TT.I && *TT.I) ? *TT.I : 'd');
if (i<0) help_exit("bad -I: %s", TT.I);
format_string = xstrdup(iso_formats[i]);
}
if (FLAG(u)) {
tz = getenv("TZ");
setenv("TZ", "UTC", 1);
tzset();
}
if (TT.d) {
if (TT.D) {
struct tm tm = {};
char *s = strptime(TT.d, TT.D+(*TT.D=='+'), &tm);
t = (s && !*s) ? xvali_date(&tm, s) : xvali_date(0, TT.d);
} else parse_date(TT.d, &t);
} else {
struct timespec ts;
struct stat st;
if (TT.r) {
xstat(TT.r, &st);
ts = st.st_mtim;
} else clock_gettime(CLOCK_REALTIME, &ts);
t = ts.tv_sec;
TT.nano = ts.tv_nsec;
}
if (FLAG(s)) {
if (setdate) help_exit("can't set two dates at once");
setdate = TT.s;
}
// Fall through if no arguments
if (!setdate);
// Display the date?
else if (*setdate == '+') {
format_string = toys.optargs[0]+1;
setdate = toys.optargs[1];
// Set the date
} else if (setdate) {
struct timeval tv;
parse_date(setdate, &t);
tv.tv_sec = t;
tv.tv_usec = TT.nano/1000;
if (settimeofday(&tv, NULL) < 0) perror_msg("cannot set date");
}
puts_time(format_string, localtime(&t));
if (FLAG(u)) {
if (tz) setenv("TZ", tz, 1);
else unsetenv("TZ");
tzset();
}
if (CFG_TOYBOX_FREE && FLAG(I)) free(format_string);
}
|
|