我遇到了 date 命令的奇怪行为:
echo '1 JAN 2023' | LC_ALL=en_US.utf8 date -d -
Run Code Online (Sandbox Code Playgroud)
这会产生明显错误的输出:
Sun Jun 11 12:00:00 AM CEST 2023
Run Code Online (Sandbox Code Playgroud)
但这没关系:
LC_ALL=en_US.utf8 date -d '1 Jan 2023' # Sun Jan 1 12:00:00 AM CET 2023
Run Code Online (Sandbox Code Playgroud)
这也可以:
my_date='1 JAN 2023'
LC_ALL=en_US.utf8 date -d "$my_date" # Sun Jan 1 12:00:00 AM CET 2023
Run Code Online (Sandbox Code Playgroud)
我无法让管道版本工作。是错误还是我做错了什么?
ste*_*ver 17
该date命令的--date/-d选项需要一个字符串参数- 标准输入被丢弃,并-根据 GNUdate命令的通用日期语法解析为日期输入字符串,其中表示
当前忽略后面不跟数字的连字符。
和
空字符串表示今天的开始(即午夜)。
所以你的命令相当于LC_ALL=en_US.utf8 date -d 'today 00:00'.
要从管道获取输入,您需要将 stdin 转换为参数 - 例如xargs:
$ echo '1 JAN 2023' | LC_ALL=en_US.utf8 xargs -d '\n' date -d
Sun Jan 1 12:00:00 AM EST 2023
Run Code Online (Sandbox Code Playgroud)
或者(如 Raffa 所建议的)将其传递给读取标准输入的命令,在命令替换中捕获该命令的输出:
$ echo '1 JAN 2023' | LC_ALL=en_US.utf8 date -d "$(cat -)"
Sun Jan 1 12:00:00 AM EST 2023
Run Code Online (Sandbox Code Playgroud)
使用该-f选项要简单得多,它从标准输入中读取:
$ echo '1 JAN 2023' | LC_ALL=en_US.utf8 date -f -
Sun Jan 1 12:00:00 AM EST 2023
Run Code Online (Sandbox Code Playgroud)
从man date:
-f, --file=DATEFILE
like --date; once for each line of DATEFILE
Run Code Online (Sandbox Code Playgroud)