bash 中的日期格式 - 案例

-2 bash date

我需要在 bash 中接收一个代码,它将以这种格式给出当前日期:

Sunday, 1^st January 2016(上标stndrdth)有 4 种情况。

接收上标的方式是什么?

我将不胜感激任何帮助。

Tob*_*ght 6

date程序没有任何产生序数的转换,因此您需要替换它之外的后缀:

#!/bin/bash

d=$(date +%e)

case $d in
    1?) d=${d}th ;;
    *1) d=${d}st ;;
    *2) d=${d}nd ;;
    *3) d=${d}rd ;;
    *)  d=${d}th ;;
esac

date "+%A, $d %B %Y"
Run Code Online (Sandbox Code Playgroud)

请注意,大多数英语风格指南建议不要将序数后缀写为上标;如果你真的坚持的话,你可以把它当作一种练习!


另请注意,通过调用date两次,我们可能会在午夜出现竞争条件。我们可以通过单独查找当前时间然后对其进行格式化来避免这种情况:

#!/bin/bash

s=$(date +@%s)
d=$(date -d $s +%e)

case $d in
    1?) d=${d}th ;;
    *1) d=${d}st ;;
    *2) d=${d}nd ;;
    *3) d=${d}rd ;;
    *)  d=${d}th ;;
esac

date -d $s "+%A, $d %B %Y"
Run Code Online (Sandbox Code Playgroud)

或者,将日期(一次)读取到单独的变量中,然后在 shell 中格式化它们:

#!/bin/bash

IFS=_ read a d b y < <(date +%A_%e_%B_%Y)

case $d in
    1?) d=${d}th ;;
    *1) d=${d}st ;;
    *2) d=${d}nd ;;
    *3) d=${d}rd ;;
    *)  d=${d}th ;;
esac

echo "$a, $d $b $y"
Run Code Online (Sandbox Code Playgroud)