Файловые дескрипторы и перенаправление

date

Если вы можете использовать дату 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.

Обратите внимание, что Калькутта является настоящим название старой Калькуты.

shell

  1. может это сделать, только если значение является целым числом (в секундах):

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

  2. может выполнять оба преобразования (в секунды и формат):

     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 )

  3. просто требуется описание формата ( -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
1
02.05.2019, 15:01
1 ответ

Во-первых, не всегда верно, что стандартный ввод связан с клавиатурой. Во-вторых, вы не используете стандартный ввод для передачи чего-либо в echo. Вы используете клавиатуру для передачи строки echo fooв вашу оболочку. Оболочка анализирует эту строку и вызывает команду с именем echo(, независимо от того, является ли команда встроенной в оболочку или исполняемым файлом /usr/bin/echoили /bin/echoне имеет значения ), которая анализирует свои аргументы, игнорирует свой стандартный ввод и записывает строкаfoo\n

3
27.01.2020, 23:22

Теги

Похожие вопросы