bash将MMM-DD-YYYY变量转换为YYYY-MM-DD

时间:2018-07-12 18:31:48

标签: bash

我正在bash中工作。我有以下变量:

$ dt = 2018年6月16日

我需要将此值转换为日期格式YYYY-MM-DD。我怎样才能做到这一点?我尝试过:

dt_new=$(date –-date="$dt" +%F)

...但是bash抛出错误消息

  

日期:非法的时间格式

3 个答案:

答案 0 :(得分:0)

您要的东西不可能仅以bash作为单衬板就可以实现。 date命令的行为因操作系统而异。如果要便携式使用此命令,则需要考虑不同的口味。

#!/usr/bin/env bash

function dateconv {
    local newdate
    case "$(uname -s)" in
      *BSD|Darwin)  newdate="$(date -jf '%b-%d-%Y' "$1" '+%F')" ;;
      Linux)        newdate="$(date -d "$1" '+%F')" ;;
      *)            echo "Can't convert this, sorry." >&2; exit 1 ;;
    esac
    echo "$newdate"
}

dateconv "${1:-$(date '+%b-%d-%Y')}"

但是,如果您想完全避免使用外部工具,则可以使用更多的代码来伪造它:

#!/usr/bin/env bash

function dateconv {
    local m=(z Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec z)
    local year month day

    year="${1##*-}"

    for f in "${!m[@]}"; do
        if [ "${1%%-*}" = "${m[$f]}" ]; then
            month="$f"
            break
        fi
    done
    if [[ $f = "z" ]]; then
        echo "Invalid month: ${1%%-*}" >&2
        exit 1
    fi

    day="${1#*-}"
    day="${day%-*}"

    printf '%04d-%02d-%02d\n' "$year" "$month" "$day"
}

dateconv "${1:-$(date '+%b-%d-%Y')}"

第二种选择不太清晰,灵活性也稍差一些,但是应该可以在Linux或BSD / macOS环境中的bash 3或4中使用。

请注意,%b日期格式表示大写的首字母。

还请注意,以上解决方案均采用您的主题(MMM-DD-YYYY)中描述的格式,而不是示例(June-16-2018)中描述的格式。毫无疑问,您可以将其调整为实际使用的格式。

答案 1 :(得分:0)

您可以使用-v选项执行此操作:

threshold

导致OS X终端出现

date -v $dt '+%Y-%m-%d

答案 2 :(得分:0)

这将在任何GNU date中工作:

$ date -d'June-16-2018' +%Y-%m-%d
2018-06-16