Форматирование даты в unix для включения суффикса для дня (st, nd, rd и th) - PullRequest
7 голосов
/ 22 марта 2010

Как добавить суффикс к номеру day даты unix?

Я объясню. У меня есть фрагмент кода TextMate, который записывает сегодняшнюю дату. Он использует дату и форматирование Unix. Вот код:

`date +%A` `date +%d` `date +%B` `date +%Y`

Это выводит:

Понедельник, 22 марта 2010 г.

Я хотел бы добавить суффикс к дню ( st , nd , rd и th ) вроде так:

Понедельник 22 марта 2010

Насколько я вижу, в форматировании даты в Unix нет встроенной функции, как в PHP (j). Как бы я достиг этого в Unix? Сложное регулярное выражение для номера дня?

Ответы [ 3 ]

9 голосов
/ 27 января 2014

Try.

#!/bin/sh
DaySuffix() {
  case `date +%d` in
    1|21|31) echo "st";;
    2|22)    echo "nd";;
    3|23)    echo "rd";;
    *)       echo "th";;
  esac
}
date "+%A %d`DaySuffix` %B %Y"
3 голосов
/ 23 марта 2010

У меня что-то похожее работает на машине с Linux (Ubuntu 8.10). Я не думаю, что это будет работать с Solaris, одна машина, которую я тестировал, не позволяла использовать символ _ после%, чтобы избежать заполнения поля нулем. Незаполнение позволяет дате возвращать 1 вместо 01 (01 не выглядишь правее против 1-го).

Я использую функцию оболочки (опять же, ваша ОС или версия оболочки может не понравиться, как я определил функцию) с именем DaySuffix, а затем вызываю эту функцию как часть вызова даты. Сам по себе функционал довольно хакерский, я уверен, что есть лучший способ сделать это, но он работает для меня. Обратите внимание на особые случаи для 11, 12 и 13 - вы должны любить английский язык!

#!/bin/sh

DaySuffix() {
    if [ "x`date +%-d | cut -c2`x" = "xx" ]
    then
        DayNum=`date +%-d`
    else
        DayNum=`date +%-d | cut -c2`
    fi

    CheckSpecialCase=`date +%-d`
    case $DayNum in
    0 )
      echo "th" ;;
    1 )
      if [ "$CheckSpecialCase" = "11" ]
      then
        echo "th"
      else
        echo "st"
      fi ;;
    2 )
      if [ "$CheckSpecialCase" = "12" ]
      then
        echo "th"
      else
        echo "nd"
      fi ;;
    3 )
      if [ "$CheckSpecialCase" = "13" ]
      then
        echo "th"
      else
        echo "rd"
      fi ;;
    [4-9] )
      echo "th" ;;
    * )
      return 1 ;;
    esac
}

# Using consolidated date command from chris_l
# Also using %-d instead of %d so it doesn't pad with 0's
date "+%A %-d`DaySuffix` %B %Y"
1 голос
/ 07 августа 2018
#!/bin/ksh
DateSuffix() {
if [ "$1" -eq "1" ] || [ "$1" -eq "21" ] || [ "$1" -eq "31" ]
then
echo 'st'
elif [ "$1" -eq "2" ] || [ "$1" -eq "22" ]
then
echo 'nd'
elif [ "$1" -eq "3" ] [ "$1" -eq "23" ]
then
echo 'rd'
else
echo 'th'
fi   
}
date "+%A %d`DateSuffix` %B %Y"
...