How can I add the suffix on the day number of a unix date?
I'll explain. I have a TextMate bundle snippit that writes out today's date. It uses unix date and formatting. Here is the code:
`date +%A` `date +%d` `date +%B` `date +%Y`
It outputs:
Monday 22 March 2010
I would like to add the suffix to the day (st, nd, rd and th) like so:
Monday 22nd March 2010
As far as I can see, there is no native function in the unix date formatting, like there is in PHP (j). How would I achieve this in unix? A complicated regex on the day number?
To format date in DD-MM-YYYY format, use the command date +%d-%m-%Y or printf "%(%d-%m-%Y)T\n" $EPOCHSECONDS .
To format date in MM-DD-YYYY format, use the command date +%m-%d-%Y . Please observe the upper and lower case letters : %m for month, %d for day and %Y for year.
date command is used to display the system date and time. date command is also used to set date and time of the system. By default the date command displays the date in the time zone on which unix/linux operating system is configured. You must be the super-user (root) to change the date and time.
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"
I have something similar working on a Linux machine (Ubuntu 8.10). I don't think it will work with Solaris, the one machine I tested did not allow using a _ character following the % to avoid padding the field with a 0. The non-padding allows date to return 1 instead of 01 (01st doesn't look right versus 1st).
I use a shell function (again, your OS or shell version may not like the way I defined the function) named DaySuffix, then call that func as part of the date call. The func itself is fairly hacky, I'm sure there is a better way to do this but it works for me. Note the special cases for 11, 12, & 13 - you've got to love the English language!
#!/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"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With