Форматируя дату в Unix для включения суффикса в день (Св., без обозначения даты, ул. и th)

Как я могу добавить суффикс на дневном количестве даты Unix?

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

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

Это производит:

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

Я хотел бы добавить суффикс ко дню (Св., без обозначения даты, ул. и th) как так:

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

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

8
задан skymook 22 March 2010 в 20:25
поделиться

1 ответ

У меня что-то подобное работает на машине Linux (Ubuntu 8.10). Я не думаю, что он будет работать с Solaris, одна машина, которую я тестировал, не позволяла использовать символ _ после%, чтобы избежать заполнения поля нулевым значением. Отсутствие заполнения позволяет date возвращать 1 вместо 01 (01st не делает не выглядит правильным по сравнению с 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"
4
ответ дан 5 December 2019 в 10:40
поделиться
Другие вопросы по тегам:

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