2014-06-12 130 views
0

說我有以下格式爲我的日期輸出:解析非標準日期格式

date --utc +%d.%m.%Y,\ %H:%M\ UTC 
# Outputs: 12.06.2014, 09:03 UTC 

如何顯示輸出的日期上面,在另一個date號召,另一種格式?我想:

date --utc --date="12.06.2014, 09:03 UTC" +%d.%m.%Y,\ %H:%M\ UTC 

,但沒有成功(它說invalid date)。

我主要試圖做到這一點,以便能夠從輸出日期知道已經過了多少小時(或者幾天,或者任何時間的測量單位)。

+1

只需刪除逗號,並用斜線替換點:'日期-utc +%d /%m /%Y \%H:%M \ UTC'。 – fedorqui

+0

您可以在'bsd date'中指定自定義日期格式,但不能在'gnu'中。 – BroSlow

回答

2

這裏是man date頁說,大約爲​​選項格式是什麼:

The --date=STRING is a mostly free format human readable date string such as 
"Sun, 29 Feb 2004 16:21:42 -0800" or "2004-02-29 16:21:42" or even "next 
Thursday". A date string may contain items indicating calendar date, time of day, 
time zone, day of week, relative time, relative date, and numbers. An empty 
string indicates the beginning of the day. The date string format is more 
complex than is easily documented here but is fully described in the info 
documentation. 

因此,你可以使用,例如:

date --date "2014-06-12 09:03 UTC" --utc +%d.%m.%Y,\ %H:%M\ UTC 
# Output: 12.06.2014, 09:03 UTC 

得到你的願望。

你可以從你的第一輸出很容易得到這一第二種形式與sed線如下:

sed 's/\([0-9]\{2\}\)\.\([0-9]\{2\}\)\.\([0-9]\{4\}\), \(.*\)/\3-\2-\1 \4/' 
    <<< '12.06.2014, 09:03 UTC' 
# Output: 2014-06-12 09:03 UTC 

注意,它可能會更快地輸出日期在ISO 8601的格式在第一時間進行再利用,例如與:

date --utc +%F\ %H:%M\ UTC 
# Output: 2014-06-12 10:12 UTC 
+1

關於ISO 8601的進一步閱讀:http://xkcd.com/1179/ – Qeole

+0

我可能沒有和你一樣的'date'版本。因此我無法執行上述操作。 – linkyndy

+0

@AndreiHorak你是說,我寫的第一個'date'命令(以'--date「2014-06-12 09:03 UTC」'爲輸入)?我使用'date(GNU coreutils)8.20'。不知道你的版本是什麼('$ date --version'),並且可能有什麼區別:/ – Qeole

1

我認爲你不能指定輸入格式,所以你必須有這樣的另一個命令來改變它:

date --utc --date="$(echo "12.06.2014, 09:03 UTC" | sed -r 's/(..).(..).(....), (..):(..) UTC/\3-\2-\1 \4:\5 UTC/')" 

此外,如果你想arithmethic在此,你可以使用+%s

DATE1=$(date "+%s" --date="$(echo "12.06.2014, 09:03 UTC" | sed -r 's/(..).(..).(....), (..):(..) UTC/\3-\2-\1 \4:\5 UTC/')") 
DATE2=$(date "+%s" --date="$(echo "17.06.2014, 08:30 UTC" | sed -r 's/(..).(..).(....), (..):(..) UTC/\3-\2-\1 \4:\5 UTC/')") 
DIFF_IN_SECONDS=$(($DATE2-$DATE1)) 
DIFF_IN_RAW_DAYS=$((($DATE2-$DATE1)/86400)) 
DIFF_IN_DATES=$(((($DATE2/86400) - ($DATE1/86400))))