2010-03-22 32 views
5

如何在一個unix日期的上添加後綴?在unix中格式化日期以包含日期的後綴(st,nd,rd和th)

我會解釋一下。我有一個TextMate包snippit,寫出今天的日期。它使用unix日期和格式。下面是代碼:

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

它輸出:

2010年3月

月22日星期一,我想後綴添加到的天(ST第二rdth)像這樣:

22日2010年3月

據我所看到的,在UNIX日期格式沒有原生的功能,如存在PHP(J)。我如何在unix中實現這一點?一天覆雜的正則表達式?

+0

實際上沒有回答你的問題,但我會鞏固日命令: 日期 「+%A%d%B%Y」 - >週一2010年3月22 – zigdon 2010-03-22 20:30:28

+0

如果我是你,我會編寫一個小的PHP腳本(因爲你已經知道如何在那裏做),並執行它。我不知道,如果可以在目標系統上安裝PHP。 – 2010-03-22 20:48:32

回答

3

我在Linux機器上有類似的工作(Ubuntu 8.10)。我認爲它不適用於Solaris,我測試的一臺機器不允許在%之後使用_字符以避免用0填充該字段。非填充允許日期返回1而不是01(01st不會對第一名看起來不錯)。

我使用shell函數(同樣,您的操作系統或shell版本可能不像我定義函數的方式)名爲DaySuffix,然後將該func作爲日期調用的一部分調用。該func本身是相當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" 
+0

我能夠使用此代碼來解決我的問題。但是,我無法使用+% - d,因爲連字符是不允許的。只有嚴格的unix格式。 http://en.wikipedia.org/wiki/Date_(Unix)。我在+位置使用了+%e,效果很好。雖然我認爲它增加了一個單個數字的額外空間(如1-9)。我會在4月1日解決這個問題。謝謝您的幫助。 ;) – skymook 2010-03-23 16:42:20

5

嘗試。

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