在unix中格式化日期以在日期包含后缀(st,nd,rd和th)

时间:2010-03-22 20:25:48

标签: regex unix date textmate

如何在unix日期的号上添加后缀?

我会解释。我有一个TextMate包snippit,写出今天的日期。它使用unix日期和格式。这是代码:

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

输出:

2010年3月22日星期一

我想将后缀添加到 st nd rd )喜欢这样:

2010年3月22日星期一

据我所知,unix日期格式中没有本机函数,就像在PHP(j)中一样。我如何在unix中实现这一目标?关于日期编号的复杂正则表达式?

3 个答案:

答案 0 :(得分:9)

尝试。

#!/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"

答案 1 :(得分:3)

我在Linux机器上有类似的东西(Ubuntu 8.10)。我不认为它适用于Solaris,我测试的一台机器不允许在%后面使用_字符以避免用0填充字段。非填充允许日期返回1而不是01(01st doesn看起来不错,与第一名相比。

我使用shell函数(再次,你的操作系统或shell版本可能不像我定义函数的方式)命名为DaySuffix,然后将该函数作为日期调用的一部分调用。功能本身相当hacky,我敢肯定有更好的方法来做到这一点但它适用于我。请注意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"

答案 2 :(得分:1)

#!/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"