我有一个日期,格式为%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
),我该怎么做呢?
任何使用除核心工具以外的其他解决方案都是无意义的,因为我正在尝试为尽可能多的Unix机器开发一个Bash脚本。
DATE=$(date "+$format1")
date --date="$DATE" "+$format2" # Error in most cases!
我需要这样做是因为用户可以给出日期格式的指令,该日期字符串将被显示。但在稍后的步骤中,我需要将此日期字符串转换为另一个固定格式。我可以操纵指令将得到哪种格式,也可以操纵输出(或用户将看到的内容)。
我无法运行两次指令,因为它非常耗时。
更新:
我已经找到了一种解决方案:
# 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
的输出吗? - Donovan