10

在 BASH shell 脚本或使用 gdate 中,给定日期如“2011 年 10 月”,我如何转换为年月数字格式?例如,输出应为“2011-10”。

4

7 回答 7

16
mydate="Oct 2011"
date --date="$(printf "01 %s" $mydate)" +"%Y-%m"

GNU 日期的 parse_datetime 接口(这是示例所使用的)有很多规则。2011 年 10 月的日期形式不是其中之一,因此您在其前面添加一个“01”并且日期喜欢它。

于 2013-03-06T16:34:53.520 回答
9
read mon year <<< "Oct 2012"
date -d "$mon 1 $year" "+%Y-%m"

结果:

2012-10
于 2013-03-06T16:42:51.640 回答
4
case "`date | awk '{print $2 }'`" in
    Jan) MON="01" ;;
    Feb) MON="02" ;;
    Mar) MON="03" ;;
    Apr) MON="04" ;;
    May) MON="05" ;;
    Jun) MON="06" ;;
    Jul) MON="07" ;;
    Aug) MON="08" ;;
    Sep) MON="09" ;;
    Oct) MON="10" ;;
    Nov) MON="11" ;;
    Dec) MON="12" ;;
esac

echo $MON
于 2014-01-10T00:12:52.827 回答
4

您可以通过查找名称字符串的位置将月份转换为数字:

#!/bin/bash

month=Oct
months="JanFebMarAprMayJunJulAugSepOctNovDec"
tmp=${months%%$month*}
month=${#tmp}
monthnumber $((month/3+1))
printf "%02d\n" $monthnumber

上面脚本的输出是:

10

您可以编码的特定字符串:

#!/bin/bash

mydate="Oct 2011"

monthnumber() {
    month=$1
    months="JanFebMarAprMayJunJulAugSepOctNovDec"
    tmp=${months%%$month*}
    month=${#tmp}
    monthnumber=$((month/3+1))
    printf "%02d\n" $monthnumber
}

arr=(`echo ${mydate}`);
month=$(monthnumber ${arr[0]})
year=$(echo ${arr[1]})
echo "$year-$month"

输出将是:

2011-10
于 2016-12-29T19:12:42.167 回答
2

我不确定是否有更短的方法可以做到这一点,但这是一种方法。这绝不是万无一失的。您可以通过向输入添加其他检查并使比较不区分大小写来改进这一点。

#!/bin/ksh
### Validate input
if [ $# -eq 0 ]
then
    echo "Usage: $0 InputMonYYYY"
    echo "Example: $0 \"Oct 2011\""
    exit 1
fi
### Read input
INPUTSTR=$1
MON_STR=`echo $INPUTSTR |cut -d' ' -f1`
YYYY_STR=`echo $INPUTSTR |cut -d' ' -f2`

if [[ "$MON_STR" = "Jan" ]] then
  MON_NUM=01
elif [[ "$MON_STR" = "Feb" ]] then
  MON_NUM=02
elif [[ "$MON_STR" = "Mar" ]] then
  MON_NUM=03
elif [[ "$MON_STR" = "Apr" ]] then
  MON_NUM=04
elif [[ "$MON_STR" = "May" ]] then
  MON_NUM=05
elif [[ "$MON_STR" = "Jun" ]] then
  MON_NUM=06
elif [[ "$MON_STR" = "Jul" ]] then
  MON_NUM=07
elif [[ "$MON_STR" = "Aug" ]] then
  MON_NUM=08
elif [[ "$MON_STR" = "Sep" ]] then
  MON_NUM=09
elif [[ "$MON_STR" = "Oct" ]] then
  MON_NUM=10
elif [[ "$MON_STR" = "Nov" ]] then
  MON_NUM=11
elif [[ "$MON_STR" = "Dec" ]] then
  MON_NUM=12
fi
echo ${YYYY_STR}-${MON_NUM}
于 2013-03-06T16:36:25.540 回答
2

Bash4 支持哈希表(尽管 Jim 的回答是正确的)。

例子

#!/bin/bash

declare -A months=( ["Jan"]="01" ["Feb"]="02" )

mydate="Jan 2011"

echo ${mydate:4:8}-"${months["${mydate:0:3}"]}"

输出:

2011-01
于 2013-03-06T16:47:13.593 回答
1

让我们踢死这匹死马。如果您不关心无效的月份名称,您可以使用我编写的这个函数,它很短(并且只有 1 个 exec),但希望一个月是有效的英文 3 字符小写或大写,并且只需要 GNU sed和重击:

m2n() { echo $((-10+$(sed 's/./\U&/g;y/ABCEGLNOPRTUVY/60AC765A77ABB9/;s/./+0x&/g'<<<${1#?}) ));}

对于您的示例,我会这样做:

read m y <<<"$@"; echo "$y-`m2n $m`"
于 2018-07-24T22:38:05.303 回答