2011-07-30 1 views
0

Salut je les chaînes suivantes ArrayList de datesJava vérification ne de jours dans un mois et ajouter des dates qui manquent

[ « 2010-08-01 », « 2010-08-02 », "2010- 08-04 "," 2010-08-05 "," 2010-08-06 "," 2010-08-07 "," 2010-08-08 "," 2010-08-09 "," 2010-08- 11 "," 2010-08-12 "," 2010-08-13 "," 2010-08-14 "," 2010-08-15 "," 2010-08-17 "," 2010-08-18 " , "2010-08-20", "2010-08-21", "2010-08-26", "2010-08-28", "2010-08-29"]

J'ai 2 objectifs que Je veux réaliser,

1) comment obtenir le nombre de jours pour chaque mois basé sur l'année et le mois ci-dessus? 2) comment ajouter la date manquante (même format que ci-dessus) pour toute la séquence de dates ci-dessus? Par exemple: 2010-08-01,2010-08-02,2010-08-04 -> Je devrais ajouter en 2010-08-03 entre 2010-08-02 et 2010-08-04

Merci !

Répondre

1

L'approche la plus simple serait d'analyser toutes les dates pour trouver la valeur maximale et minimale. Puis générez une liste de toutes les dates entre le minimum et le maximum.

public static void main(String... args) throws ParseException { 
    String[] dates = { "2010-08-01","2010-09-02","2010-07-28","2010-08-29" }; 
    String[] dates2 = fillInDates(dates, "yyyy-MM-dd"); 
    System.out.println(Arrays.toString(dates2)); 
} 

private static final long MILLIS_PER_DAY = 24L * 3600 * 1000; 

private static String[] fillInDates(String[] dates, String format) throws ParseException { 
    if (dates == null || dates.length < 1) return dates; 

    SimpleDateFormat sdf = new SimpleDateFormat(format); 
    long min = Long.MAX_VALUE, max = Long.MIN_VALUE; 
    for (String date : dates) { 
     long time = sdf.parse(date).getTime(); 
     if(min > time) min = time; 
     if(max < time) max = time; 
    } 
    String[] dates2 = new String[(int) ((max - min)/MILLIS_PER_DAY+1)]; 
    for(int i=0;i<dates2.length;i++) 
     dates2[i] = sdf.format(new Date(min + i * MILLIS_PER_DAY)); 
    return dates2; 
} 

impressions

[2010-07-28, 2010-07-29, 2010-07-30, 2010-07-31, 2010-08-01, 2010-08-02, 2010 -08-03, 2010-08-04, 2010-08-05, 2010-08-06, 2010-08-07, 2010-08-08, 2010-08-09, 2010-08-10, 2010-08 -11, 2010-08-12, 2010-08-13, 2010-08-14, 2010-08-15, 2010-08-16, 2010-08-17, 2010-08-18, 2010-08-19 , 2010-08-20, 2010-08-21, 2010-08-22, 2010-08-23, 2010-08-24, 2010-08-25, 2010-08-26, 2010-08-27, 2010 -08-28, 2010-08-29, 2010-08-30, 2010-08-31, 2010-09-01, 2010-09-02]

1

Heureux de vous voir utiliser la norme ISO 8601. Qu'est-ce que l'un des plus grands avantages de l'ISO 8601? C'est vrai: vous pouvez trier les dates en triant les chaînes.

Dans votre cas, commencez par trier votre tableau (ou faites-en une copie et triez-le). Le tri des chaînes fonctionnera.

Commencez maintenant à parcourir votre liste. Pour chaque article, il est trivial de choisir l'année, le mois et le jour. Chaque fois que vous voyez un nouveau année et mois, enregistrez cela comme votre jour minimum du mois. Lorsque vous parcourez le tableau, vous verrez des lacunes que vous pouvez combler. Lorsque vous passez d'une année à l'autre, vous pourrez enregistrer le jour maximum pour le mois. Il ya un peu de comptabilité là-bas, et vous ne pouvez pas vraiment insérer au milieu d'un tableau facilement, donc si j'étais vous, je générerais votre résultat dans un nouvel objet tableau.

Il prendra quelques lignes de code, mais rappelez-vous de profiter du tri de chaîne de manière est la date de tri dans la norme ISO 8601.

1

Pour votre première tâche:

List<String> strings = Arrays.asList(
      "2010-08-01", "2010-08-02", "2010-08-04", "2010-08-05", "2010-08-06", "2010-08-07", "2010-08-08", 
      "2010-08-09", "2010-08-11", "2010-08-12", "2010-08-13", "2010-08-14", "2010-08-15", "2010-08-17", 
      "2010-08-18", "2010-08-20", "2010-08-21", "2010-08-26", "2010-08-28", "2010-08-29" 
    ); 

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
    GregorianCalendar calendar = new GregorianCalendar(); 


    ArrayList<Date> dates = new ArrayList<Date>(strings.size()); 

    for (String string : strings) { 
     dates.add(dateFormat.parse(string)); 
    } 

    int[] countByMonth = new int[12]; 
    for (Date date : dates) { 
     calendar.setTime(date); 
     countByMonth[calendar.get(Calendar.MONTH)]++; 
    } 
Questions connexes