[英]linux bash - Parse date in custom format
我有一個%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ültigesDatum„ Do 19 Dez 2013 22:33:28 CET“ = date: invalid date „Do 19 Dez 2013 22:33:28 CET“
)
困難在於我不知道以后將使用哪種語言環境,甚至不知道日期格式,因為用戶可以設置自己的格式。 因此,一個簡單的特定解析解決方案就無法真正起作用!
但是我該怎么辦呢?
概括問題:
如果我有一個日期格式format1
(可以是任意一個或至少可以反轉) ,則可以使用date獲得格式化的日期。 但是,如果我想將其格式化為另一個日期( format2
),該怎么辦?
使用除coreutils之外的任何方法的解決方案都是毫無意義的,因為我試圖為盡可能多的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")
這是可行的,可能對其他人有幫助。 因此,我將與您分享。
從GNU coreutils 8.22開始,-- --date
不可能。 從日期手冊中:
'-d datestr'
'--date = datestr'
顯示datestr中指定的日期和時間,而不是當前日期和時間。 datestr幾乎可以是任何常見格式。 它可以包含月份名稱,時區,“ am”和“ pm”,“昨天”等。例如,--date =“ 2004-02-27 14:19:13.489392193 +0530”指定了以下時間點:是在2004年2月27日下午2:19:13 PM之后的489,392,193納秒,位於UTC以東5小時30分鍾。
注意:當前輸入必須采用與語言環境無關的格式。 例如,在許多語言環境中,需要下面的LC_TIME = C來打印正確的日期:
date -d "$(LC_TIME=C date)"
http://www.gnu.org/software/coreutils/manual/html_node/Options-for-date.html#Options-for-date
請注意,它說輸入格式不能為特定於語言環境的格式。
可能還有其他的庫或程序可以識別更多的日期格式,但是對於給定的日期格式,編寫簡短的程序以將其轉換為日期可識別的內容(例如,使用Perl或awk)並不困難。
你為什么不保存時間unixtime(即毫秒自1970年1月1日)像1388198714
?
試圖將世界各地的所有日期格式解析為一擊式bash腳本而沒有合理依賴的要求,這有點荒謬。
您可以使用libdatetime-format-flexible-perl
。
#!/usr/bin/perl
use DateTime::Format::Flexible;
my $date_str = "So 22 Dez 2013 07:29:35 CET";
$parser = DateTime::Format::Flexible->new;
my $date = $parser->parse_datetime($date_str);
print $date
默認輸出為2013-12-22T07:29:35
,但是由於$date
不是常規字符串而是對象,因此您可以執行以下操作:
printf '%02d.%02d.%d', $date->day, $date->month, $date->year;
另外, date
行為可能也應視為錯誤。我認為是這樣,因為正確解析了格式相同但俄語的日期。
$ export LC_TIME=ru_RU.UTF-8 $ NOW="$(date "+%c")" $ date --date="$NOW" '+%d.%m.%Y' 22.12.2013
如果您認為格式錯誤,我想您想要的是:
NOW=$(date +%c)
date --date="$NOW" +%d/%m/%Y
注意小寫的%d
和%m
。
在本地,這是我得到的:
root@server2:~# NOW=$(date +%c)
root@server2:~# date --date="$NOW" +%d/%m/%Y
19/12/2013
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.