【发布时间】:2013-12-19 21:16:51
【问题描述】:
我有一个%c 格式的日期(可以是其他格式),我需要在 date 命令中使用它。 %c 不是美国格式。它是德国服务器,因为它是德国服务器。这在美国服务器上也无法正常工作。 (区域设置为德语或美国)
这不起作用(包括错误):
user@server:~$ NOW=$(date +%c); echo $NOW
Do 19 Dez 2013 22:33:28 CET
user@server:~$ date --date="$NOW" +%d/%m/%Y
date: ungültiges Datum „Do 19 Dez 2013 22:33:28 CET“
(日期:ungültiges Datum „Do 19 Dez 2013 22:33:28 CET“=date: invalid date „Do 19 Dez 2013 22:33:28 CET“)
困难在于我不知道以后会使用哪个语言环境甚至哪个日期格式,因为用户可以设置自己的格式。所以一个简单的特定解析解决方案是行不通的!
但是我该怎么做呢?
概括问题:
如果我有一个日期格式format1(可以是任何或至少一个可以反转的)我可以使用日期来获取格式化的日期。但是,如果我想将其格式化为另一个日期 (format2),我该怎么做?
任何使用 coreutils 以外的解决方案都是没有意义的,因为我正在尝试为尽可能多的 unix 机器开发一个 bash 脚本。
DATE=$(date "+$format1")
date --date="$DATE" "+$format2" # Error in most cases!
这是必需的,因为我有一个用户可以提供日期格式的命令。将显示此日期字符串。但在后面的步骤中,我需要将此日期字符串转换为另一个固定的日期字符串。我可以操纵命令将获得的 whcih 格式,并且可以操纵输出 (或用户将看到的内容)。
我无法运行该命令两次,因为它非常耗时。
更新:
我找到了类似的解决方案:
# Modify $user_format so it can be parsed later
user_format="$user_format %s"
# Time consuming command which will print a date in the given format
output=$(time_consuming_command params "$user_format" more params)
# This will only display what $user_format used to be
echo ${output% *}
# A simple unix timestamp parsing ("${output##* }" will only return the timestamp)
new_formated_date=$(date -d "1970-01-01 ${output##* } sec UTC" "+$new_format")
这是有效的,可能对其他人有帮助。因此,我将与您分享。
【问题讨论】:
-
为什么这不起作用?你遇到了什么错误?
-
嗯,我们可以看看你的
date +%c的输出吗? -
env | grep ^LC的输出是什么 -
使用 format1 获取当前日期然后使用它以 format2 打印有什么意义?你不能直接在 formrat2 中获取当前日期吗?如果您在非当前日期尝试此操作,例如从文件或表中提取的日期,那么它会更有意义。
-
您能否更好地解释一下具体的用例?我认为您不能使用这种通用方法,尤其是仅使用 bash 和 coreutils .. (有些库试图猜测日期时间格式,但当然它们既不完美也不在任何标准库中.. )