我正在bash中工作。我有以下变量:
$ dt = 2018年6月16日
我需要将此值转换为日期格式YYYY-MM-DD。我怎样才能做到这一点?我尝试过:
dt_new=$(date –-date="$dt" +%F)
...但是bash抛出错误消息
日期:非法的时间格式
答案 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