2010-02-10 39 views
3

我正在研究一個ant腳本。在這個特定的部分,我需要獲得當前的月份,以及上個月。我正在考慮類似的東西Ant:如何減去兩個屬性(包含時間戳)?

<tstamp> 
    <format property="thismonth" pattern="MMyy"/> <!-- 0210 by february 2010--> 
</tstamp> 

<!--I'd like to get 0110 (january 2010) here, but can't imagine how--> 
<property name="priormonth" value="?"> 

我一直在讀物業傭工,但我不能得到我需要的東西。 有什麼建議嗎?

在此先感謝。

回答

4

你可以做一個習慣米的JavaScript scriptdef

<project default="build"> 

    <target name="build"> 
     <echo message="Hello world"/> 
     <setdates/> 
     <echo message="thismonth ${thismonth}"/> 
     <echo message="priormonth ${priormonth}"/> 
    </target> 

    <scriptdef name="setdates" language="javascript"> 
     <![CDATA[ 

      importClass(java.text.SimpleDateFormat); 
      importClass(java.util.Calendar); 

      today = new Date(); 

      cal = Calendar.getInstance(); 
      cal.setTime(today); 
      cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) - 1); 

      priormonth = cal.getTime(); 

      fmt = new SimpleDateFormat("MMyy"); 

      self.getProject().setProperty('thismonth', fmt.format(today)); 
      self.getProject().setProperty('priormonth', fmt.format(priormonth)); 

     ]]> 
    </scriptdef> 

</project> 
+0

我真的很喜歡這個。 – Tom 2010-02-10 18:36:38

+0

直到現在,我從來沒有想過使用scriptdef和javascript來簡化任務定義。謝謝! – akr 2010-02-10 20:50:09

2

我敢肯定,一些正則表達式可以做到奇蹟,但我會簡單地創建一個自定義任務。

在您的任務中,您可以使用getProjet().setProperty()方法定義新屬性。

類似以下內容就足夠了:

public class PreviousMonthTask extends Task { 

    private String currentDate; 
    private String propertyName; 

    public void setCurrentDate(String currentDate) { 
     this.currentDate = currentDate; 
    } 

    public void setPropertyName(String propertyName) { 
     this.propertyName = propertyName; 
    } 

    @Override 
    public void execute() throws BuildException { 
     // calculate the previous month 
     String previousMonth = ...; 
     getProject().setProperty(this.propertyName, previousMonth); 
    } 

} 

什麼剩下要做的就是定義一個屬性與鏈接的類文件:

previousmonth = org.myproject.PreviousMonthTask 

當加載任務(見螞蟻文檔),你只需要調用你的任務:

<previousmonth propertyName="previous" currentDate="${current}"/> 
+0

將看看這兩種方法,謝謝。 – Tom 2010-02-10 18:31:42

+0

我使用腳本解決方案,因爲它提供了一個嵌入式解決方案,而不是在一個巨大的項目中創建一個Java類,而是將看未來麻煩的自定義任務。 謝謝。 – Tom 2010-02-10 18:50:48

2

ANT的tstamp task有一個偏移元素:

<tstamp> 
    <format property="twoDaysAgo" pattern="yyyy-MM-dd" offset="-2"/> 
</tstamp> 

這將返回我前兩天時間戳。如果你的模式是幾個月,我希望你能夠做同樣的事情,那麼抵消可能會在幾個月內。

+0

請看看,謝謝。 – Tom 2010-02-10 19:23:10

1

其實你可以使用:

<tstamp> 
    <format property="twoDaysAgo" pattern="yyyy-MM-dd" unit="day" offset="-2"/> 
</tstamp> 

因此,對於2個月前使用:

<tstamp> 
    <format property="twoDaysAgo" pattern="yyyy-MM-dd" unit="month" offset="-2"/> 
</tstamp>