簡體   English   中英

linux bash-以自定義格式解析日期

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM