2010-02-10 44 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>