2010-02-10 2 views
3

Я работаю над скриптом муравья. В этой конкретной части мне нужно получить текущий месяц, а также предыдущий месяц. Я думал что-то похожее на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

Вы можете сделать это с помощью custo м 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

+0

До сих пор мне никогда не приходило в голову использовать скриптdef и javascript для упрощения определений задач. Благодаря! – akr

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 

При загрузке задачи (см Ant), вам просто нужно вызвать свою задачу:

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

будет смотреть на обоих подходов, спасибо. – Tom

+0

Я пошел с решением для скриптинга, он обеспечивает встроенное решение, вместо того, чтобы создавать Java-класс в огромном проекте, но будет смотреть на пользовательские задачи для будущего troublesolving. Спасибо. – Tom

2

Муравьев tstamp task имеет смещенный элемент:

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

Это возвращает мне метку времени на два дня назад. Я ожидаю, что вы сможете сделать то же самое, если ваш шаблон будет месяцами, а затем смещение, вероятно, будет работать через несколько месяцев.

+0

Посмотрите, спасибо. – Tom

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> 
Смежные вопросы