Если вы можете использовать дату GNU, это будет делать то, что вы хотите:
$ d='2017-03-08T19:41:26Z'
$ date +'%F' -ud "$d"
2017-03-08
Используйте параметр -u
, чтобы избежать некоторых проблем со значением TZ
(или локаль).
Если вам нужно значение даты в каком-либо другом месте, значение локальной TZ будет работать с этой опцией:
$ date +'%F' -d "$d"
2017-03-08 # May change in some locales.
Или вы можете выбрать использование определенного значения для TZ:
$ TZ=Asia/Kolkata date +'%F' -d "$d"
2017-03-09 # next day in India.
Обратите внимание, что Калькутта является настоящим название старой Калькуты.
bash может это сделать, только если значение является целым числом (в секундах):
$ printf '% (% F) T \ n' $ (date + '% s' - d "$ d")
08.03.2017
Однако на bash влияет значение TZ
(или локаль):
$ TZ = GGG + 3 bash -c 'printf "% (% FT% T) T \ n" $ (date + "% s" -ud "$ 1")' sh "$ d"
08.03.2017T16 : 41: 26Z
Обратите внимание на T16: выше (а не на 19).
ksh может выполнять оба преобразования (в секунды и формат):
ksh $ printf '% (% F) T \ n' "$ d"
08.03.2017 { {1}}
Но в равной степени зависит от TZ (или локали):
$ TZ = GGG-7 ksh93 -c 'printf "% (% FT% T) T \ n" "$ 1"' sh " $ d "
2017-03-09T02: 41: 26
Обратите внимание на 09T02 (не 08T19
)
busybox просто требуется описание формата ( -D
) ввода ( -d
).
$ busybox date -u -D '% Y-% m-% dT% TZ' -d "$ d" + '% F'
08.03.2017
Использование -u
позволяет избежать любого воздействия TZ
на вывод. Однако в текущей версии busybox date еще не реализован синтаксический анализ значения TimeZone ( -0400
). Но, возможно, в будущем -z
станет защитой на будущее.
Если значение всегда имеет T для обозначения времени и всегда находится в Z
(время в зулусах), этой строковой операции будет достаточно (для получения даты на основе зулусов).
$ echo " ${d%%T*}"
2017-03-08
Во-первых, не всегда верно, что стандартный ввод связан с клавиатурой. Во-вторых, вы не используете стандартный ввод для передачи чего-либо в echo
. Вы используете клавиатуру для передачи строки echo foo
в вашу оболочку. Оболочка анализирует эту строку и вызывает команду с именем echo
(, независимо от того, является ли команда встроенной в оболочку или исполняемым файлом /usr/bin/echo
или /bin/echo
не имеет значения ), которая анализирует свои аргументы, игнорирует свой стандартный ввод и записывает строкаfoo\n