2017-03-10 2489 views
0

我有兩個字符串,每個字符串都從各自的shell命令獲得,並且不是統一格式。獲得 兩串如下:Groovy - 比較日期和時間

Date : Tue Feb 28 16:23:20 2017 -0600 
Executed at : Tue Feb 28 17:24:06 EST 2017 

編輯:我得到上述日期,一個通過git的日誌和其他通過貓和存儲都在變量

第一次約會是通過獲得並存儲在X :

sh 'git log <file> | grep Date | head -n 1 > X ' 

二日通過了以下並存儲在Y:

sh 'cat chef-policy-release.log | grep <file> | tail -n 1 | grep -o "Executed at.*" > Y' 

現在我想挑選出其中的日期和時間,並希望檢查執行時間是否在日期值之後?

+0

你能提供更多的比賽嗎?你把日期變成變量了嗎?你需要groovy的解決方案嗎? – Rao

+0

你如何運行這些命令?在命令提示符下?並將這些值提供給groovy腳本?或者,如何將這些日期記錄到您想要比較的程序中? – Rao

+1

這是我的groovy腳本的一部分。我正在Jenkins管道上運行它。我想添加一個預先檢查來比較執行特定操作之前的兩個日期。 – Sriram

回答

1

你在這裏。

def dateStr1 = 'Tue Feb 28 16:23:20 2017 -0600' 
def dateStr2 = 'Tue Feb 28 17:24:06 EST 2017' 
def pattern1 = "EEE MMM dd HH:mm:ss yyyy Z" 
def pattern2 = "EEE MMM dd HH:mm:ss z yyyy" 
def date = new Date().parse(pattern1, dateStr1) 
def executeDate = new Date().parse(pattern2, dateStr2) 
assert date < executeDate, 'Execute Date is earlier than the date' 

您可以快速在線試用(陰性)Demo

編輯:基於OP的評論解析字符串並提取日期
你本來可以@GreBeardedGeek的解析邏輯。

//Closure to get the date parsed 
def getDate = { delimiter, dateFormat, dateStr -> 
    def dt = dateStr.substring(dateStr.indexOf(delimiter) + 1).trim() 
    println dt 
    new Date().parse(dateFormat, dt) 
} 

def dateStr1 = 'Date : Tue Feb 28 16:23:20 2017 -0600' 
def dateStr2 = 'Executed at : Tue Feb 28 17:24:06 EST 2017' 
def pattern1 = "EEE MMM dd HH:mm:ss yyyy Z" 
def pattern2 = "EEE MMM dd HH:mm:ss z yyyy" 
def date = getDate(':', pattern1, dateStr1) 
def executeDate = getDate(':', pattern2, dateStr2) 
assert date < executeDate, 'Execute Date is earlier than the date' 

編輯#2可以更簡化爲:

//Set/assign the two dates 
def dateStr1 = 'Date : Tue Feb 28 16:23:20 2017 -0600' 
def dateStr2 = 'Executed at : Tue Feb 28 17:24:06 EST 2017' 
def getDate = { dateStr -> Date.parse(dateStr.substring(dateStr.indexOf(':') + 1).trim()) } 
assert getDate(dateStr1) < getDate(dateStr2), 'Execute Date is earlier than the date' 
+0

很棒!一個簡單的問題,我嘗試做X.split(「:」)嘗試從兩個變量中分離出左邊的Date和Exec at,但它似乎不起作用。任何其他方式分裂出來,並得到所需的格式,因爲你用過? – Sriram

+0

你的意思是,你想要我提取日期字符串出'日期:星期二2月28日16:23:20 2017 -0600'? – Rao

+0

如果我們能夠提取「Feb 28 16:23:20 2017」,Ya會很棒......如果不想Atleast摘錄「Tue Feb Feb 28 16:23:20 2017 -0600」忽略「Date :「 – Sriram

1

類似饒的答案,但有一個函數來解析字符串,不需要日期格式字符串,而無需創建不需要日期實例:

class DateTest{ 
    public static void main(String[] args) { 
    String logDateString = args[0]; 
    String execDateString = args[1]; 

    Date logDate = parseDate(logDateString); 
    Date execDate = parseDate(execDateString); 

    System.out.println(execDate > logDate); 
    } 

    static def parseDate(String rawString) { 
    String dateString = rawString.substring(rawString.indexOf(":") + 1).trim(); 
    new Date(Date.parse(dateString)); 
    } 
} 
+0

感謝您的回答,只要有可能就會嘗試使用它。到目前爲止,隨着饒的回答,因爲它更容易放入groovy腳本。你的工作也很完美。 – Sriram