2014-04-26 31 views
1

我有像[%Y-%m-%d %H:%M:%S]和時間戳[2009/05/11 07:30:00]時間格式。我需要的是如何比較這兩個值。可能的是,時間戳與時間格式不相似,例如[%Y-%m%d %H:%M]。這是錯誤的。 有些想法?如何比較時間格式和時間戳?

回答

0

verify一個日期字符串是在一個特定的格式,可以強制日期成你想要的格式和驗證字符串是一樣的,你開始:

$ format='%Y/%m/%d %H:%M:%S' 
$ invalid_date='2009/05/11 07:30' 
$ [ "$(date --date="$invalid_date" +"$format")" = "$invalid_date" ] 
$ echo "$?" 
1 
$ valid_date='2009/05/11 07:30:00' 
$ [ "$(date --date="$valid_date" +"$format")" = "$valid_date" ] 
$ echo "$?" 
0 

這將僅適用於日期字符串這是date兼容的(你不能指定輸入直接date格式化)工作。

+0

因爲格式是'這是無效-'和日期有'/'年之間,月,日。修好後就可以了。謝謝@ l0b0 – Stepan

+0

@ user3531485謝謝,修復它。 – l0b0

2

如果日期不一定相同的格式,一個簡單的辦法就是將它們轉換爲Unix的時間戳:

$ date --date="2009/05/11 07:30:00" +%s 
1242023400 
$ date --date="2009/05/11 07:30" +%s 
1242023400 

這會給你一個整數值,你可以很容易地比較使用:

if [ "$(date --date="$my_date" +%s)" -gt "$(date --date="$my_other_date" +%s)" ] 

date瞭解許多常見的日期格式,而不必先輸入輸入。

+0

但[2009/05/11 07:30:00]與[%Y-%m%d%H:%M]不一樣。意思是返回碼是1,不等於錯等。 – Stepan

+0

使用來自GNU coreutils的'date' 8.22,兩種情況下的退出代碼都是0,並且它們給出了相同的結果。你在使用不同的'日期'嗎? – l0b0

+0

是的,我知道。但對我來說重要的是時間格式。在我的腳本,如果不是相同的,則返回1,如果是相同的,則返回0 示例: 如果[[ 「[%Y-%間 - %d%H:%M:%S]」 當量「 [2009/05/11 07:30:00]「]] && return 0 ||返回1 – Stepan

0

如果日期是相同的格式,並且該格式是4位數的年份,然後月,日,時,分,秒,但有些是在結束截斷,那麼您可以在後綴填寫和比較這些日期爲字符串:

$ rpad_date() { 
    case ${#1} in 
     4) 
      format='%s/01/01 00:00:00' 
      ;; 
     7) 
      format='%s/01 00:00:00' 
      ;; 
     10) 
      format='%s 00:00:00' 
      ;; 
     13) 
      format='%s:00:00' 
      ;; 
     16) 
      format='%s:00' 
      ;; 
     19) 
      format='%s' 
      ;; 
     *) 
      echo "Unknown format: $1" >&2 
      return 1 
    esac 
    printf "$format" "$1" 
} 
$ rpad_date "2004" 
2004/01/01 00:00:00