2015-10-20 74 views
1

我看不到任何方式指定date解析格式,和我的輸入格式無法識別:如何將字符串轉換爲特定格式的DateTime?

dt1=`date --date="20151020T113100.475"`; echo $dt1 # fails with 'invalid date' 
+0

你是什麼意思?你想給一個格式的日期,並以另一種格式? –

+1

「日期」理解格式或不理解格式。根據您的系統,功能會有所不同。如果你想要更多的控制,你需要使用更強大的東西,比如Perl的內置'Time :: Piece'模塊,它允許你指定一個格式字符串。 –

+0

是的。我有2個日期時間,格式爲%Y%d%dT%H%M%S.%N。我想比較他們 – ManInMoon

回答

2

至於建議的DevSolar,如果你的arent做任何其他日期處理這些值,可以只需使用

if [[ $dt1 < $dt2 ]]; then 
    # your logic here.. 
    printf "less than..\n"; 
else 
    # your logic here.. 
    printf "greater than or equal..\n"; 
fi 

如果需要轉換這些日期的形式和/或想驗證字符串輸入,可以使用bash子提取:

$ dt1="20151020T113100.475" 
$ date -d "${dt1:0:4}-${dt1:4:2}-${dt1:6:2} ${dt1:9:2}:${dt1:11:2}:${dt1:13:6}" 
Tue Oct 20 11:31:00 AEDT 2015 

輸出格式也可以在這裏被應用於例如:

$ date -d "${dt1:0:4}-${dt1:4:2}-${dt1:6:2} ${dt1:9:2}:${dt1:11:2}:${dt1:13:6}" +"%s" 
1445301060 

此處%s給出秒因爲1970-01-01 00:00:00 UTC

所以與另一個日期進行比較(dt2 ),可以使用類似於

dt1="20151020T113100.475" 
dt2="20151021T113100.475" 
ts1=$(date -d "${dt1:0:4}-${dt1:4:2}-${dt1:6:2} ${dt1:9:2}:${dt1:11:2}:${dt1:13:6}" +"%s") 
ts2=$(date -d "${dt2:0:4}-${dt2:4:2}-${dt2:6:2} ${dt2:9:2}:${dt2:11:2}:${dt2:13:6}" +"%s") 
if ((ts1<ts2)); then 
    # your logic here.. 
    printf "less than..\n" 
else 
    # your logic here.. 
    printf "greater than or equal..\n" 
fi 

其輸出

less than.. 

看到man date的有效輸出格式

+1

如果所有你走出來的是更大/相等與更少,你可以做'if [[$ dt1 <$ dt2 ]]'沒有任何事先轉換... – DevSolar

+0

是的,如果這是用戶想要處理此日期信息的唯一事情 – amdixon

0

正如你可以看到,有許多不同的方法來解決這個問題。正確指出,關鍵是找到一種格式,date -d "string"考慮一個有效的日期/時間字符串。與原來的字符串開始:

20151020T113100.475 

一位接近格式的日期將接受的是:

20151020 11:31:00.475 

獲取當前字符串轉換成新的格式,只是需要子去除一些重複和拼湊到一起再次。一個簡短的腳本,將工作是:

#!/bin/bash 

d="20151020T113100.475" 

dt=${d%T*}   ## 20151020 
tm=${d#*T}   ## 113100.475 
tfrac=${tm#*.}  ## 475 
tm=${tm%.$tfrac} ## 113100 

## add : between time components 
for ((i = 0; i < ${#tm}; i+=2)); do 
    nt=$nt:${tm:$i:2} 
done 
nt=${nt:1}   ## 11:31:00 
nt=${nt}.$tfrac  ## 11:31:00.475 

echo "date : '$(date -d "$dt $nt" +"%x %X (+.%N nanosecs)")'" 

exit 0 

輸出

$ bash parsedtstamp4.sh 
date : '10/20/2015 11:31:00 AM (+.475000000 nanosec)' 
相關問題