2010-02-10 6 views
3

Je travaille sur un script ant. Dans cette partie particulière, j'ai besoin d'obtenir le mois en cours, ainsi que le mois précédent. Je pensais quelque chose de similaire àAnt: Comment puis-je soustraire deux propriétés (contenant des horodatages)?

<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="?"> 

J'ai lu sur des aides de propriété, mais je ne peux pas obtenir ce que je dois. Des idées?

Merci d'avance.

Répondre

4

Vous pouvez le faire avec un custo m 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

J'aime vraiment ça. – Tom

+0

Jusqu'à présent, il ne m'est jamais venu à l'esprit d'utiliser scriptdef et javascript pour simplifier les définitions de tâches. Merci! – akr

2

Je suis sûr que certains regex peuvent faire des merveilles mais je créerais simplement une tâche personnalisée.

Dans votre tâche, vous pouvez définir une nouvelle propriété avec la méthode getProjet().setProperty().

Quelque chose comme ce qui suit devrait suffire:

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); 
    } 

} 

Qu'est-ce qui reste à faire est de définir un fichier de propriétés avec un lien vers la classe:

previousmonth = org.myproject.PreviousMonthTask 

Lorsque vous chargez la tâche (voir Documentation Ant), il vous suffit d'appeler votre tâche avec:

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

va jeter un oeil aux deux approches, merci. – Tom

+0

Je suis allé avec la solution de script parce qu'elle fournit une solution intégrée, au lieu de créer une classe Java dans un projet énorme, mais examinera les tâches personnalisées pour les futures problématiques. Merci. – Tom

2

ANT de tstamp task a un élément offset:

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

Cela me renvoie un horodatage pour il y a deux jours. Je m'attendrais à ce que vous soyez capable de faire la même chose si votre modèle est des mois, alors le décalage fonctionnerait probablement en mois.

+0

Je vais jeter un coup d'oeil, merci. – Tom

1

vous pouvez réellement utiliser:

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

Donc, pendant 2 mois avant que vous utilisez:

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