如何在给定的一天使用日期+%u来查找星期几

时间:2015-11-04 02:39:35

标签: bash date

是否可以使用$ date +%u来计算特定日期的星期几?我将在预测估算中使用这一行。

例如:

DOW=Monday
day_no=`date "$DOW" +%u`    # Should output 1
echo "$DOW is $day_no"       

或者我应该使用if或case方法:

if [ "$DOW" == "Monday" ]
then
   day_no=1
elif [.....]
then
 ....

第一种方法是3行,if或case方法是20行。

我正在使用Bash。

2 个答案:

答案 0 :(得分:1)

如果您将$DOW传递给-d标记,该标记会显示格式化时间的说明,它会为您提供所需内容:

day_no=$(date -d "$DOW" +%u)

请注意,这会将1分配给星期一,7分配给星期日。

答案 1 :(得分:0)

实现这一目标的方法很多。

如果您想使用特定于bash的内容,我建议使用数组。在bash 4中,可以使用关联数组,如下所示:

declare -A days='([Monday]="1" [Tuesday]="2" etc...)'

DOW="Monday"

day_no=${days[$DOW]}

如果您在bash 3中(例如在OSX中),则可能需要浏览非关联数组。

declare -a days='([1]="Monday" [2]="Tuesday" etc...)'

DOW="Monday"

for _ in "${!days[@]}"; do
  if [ "${days[$_]}" = "$DOW" ]; then
    day_no=$_
    break
  fi
done

如果您想使用date命令处理此问题,了解您正在使用的平台非常重要,因为date在不同的操作系统中表现不同。以下内容可能对您有用:

case $(uname -s) in
  Linux)        day_no=$(date -d "$DOW" '+%u') ;;
  *BSD|Darwin)  day_no=$(date -j -f '%A' "$DOW" '+%u') ;;
  *)
    echo "ERROR: I don't know how to do this in $(uname -s)." >&2
    exit 1
    ;;
esac

请注意,其中一个基于阵列的解决方案可能比涉及调用外部程序(date)的解决方案更快。