2010-03-29 5 views

Répondre

0

LOL, Voulez-vous définir la dernière date au 21 décembre 2012? mais ça ne s'arrête pas là, ça recommence, donc vous voulez recommencer à compter après le 21 décembre 2012?

1

La meilleure façon d'utiliser d'autres calendriers/chronologies en Java est l'excellente bibliothèque Joda-Time. Il n'a pas de chronologie maya en soi, mais vous pouvez corriger votre propre implémentation des règles mayas et la brancher. Cela ne devrait pas être trop onéreux.

+2

Je ne sais pas si c'est si facile, même Jon Skeet a punted: http://msmvps.com/blogs/jon_skeet/archive/2009/11/06/noda-time-is-born.aspx#1738663 – Thilo

+0

Il écrit une ligne droite port, et veut se concentrer sur cela plutôt que des fonctionnalités supplémentaires telles que de nouvelles chronologies. Je pense que c'est assez juste, sans indiquer à quel point il serait difficile d'écrire une nouvelle chronologie. – GaryF

1

Utilisez JodaTime. Oups, désolé, juste un réflexe en lisant une question à propos de java.util.Calendar ;-)

Il ya quelques Java applets sur le web qui pourraient vous être utiles.

6

Votre calendrier est-il épuisé maintenant? :-)

+3

+1 Pour s'amuser –

1

Si vous cherchez vraiment une solution, ce Maya Calendar implementation semble assez bon.

Il implémente une maya Tzolk'in calender en utilisant Java GregorianCalendar. Les dates peuvent être récupérées au format Grégorien ou Tzolk'in.

Voici les éléments essentiels:

[...] 
/** parses Date specified in Long Count format, e.g. "12.19.19.17.19" */ 
public void parseLongCountDate (String longCountDate) { 
    String [] components = longCountDate.split("\\."); 
    try { 
      if (components.length != 5) 
       throw new Exception("Expecting 5 numbers separated by dots"); 
      int baktuns = Integer.valueOf(components[0]); 
      int katuns = Integer.valueOf(components[1]); 
      int tuns = Integer.valueOf(components[2]); 
      int winals = Integer.valueOf(components[3]); 
      int kins = Integer.valueOf(components[4]); 
      set (baktuns, katuns, tuns, winals, kins); 
    } catch (Throwable e) { 
      throw new IllegalArgumentException("Invalid long count date format: " 
      + e.getMessage()); 
    } 
} 

/** Set date to given long count date */ 
public void set (int baktuns, int katuns, int tuns, int uinals, int kins) { 
    assert MayaTimeUnit.Kin.toDays (1) == 1; 
    daysSinceGreatCycle = 
      MayaTimeUnit.Baktun.toDays (baktuns) + 
      MayaTimeUnit.Katun.toDays(katuns) + 
      MayaTimeUnit.Tun.toDays(tuns) + 
      MayaTimeUnit.Winal.toDays(uinals) + 
      kins; 
} 

[...] 

/** @return day name number in Tzolk'in calendar, e.g. it returns 0 (Ajaw) for the day "4 Ajaw" */ 
public Tzolkin toTzolkinDayName() { 
    // The Tzolk'in date is counted forward from 4 Ajaw. 
    return Tzolkin.DAYS[(daysSinceGreatCycle + 19) % 20]; // relative to Ajaw 
} 

/** @return day number in Tzolk'in calendar, e.g. it returns 4 for the day "4 Ajaw" */ 
public int toTzolkinDayNumber() { 
    // The Tzolk'in date is counted forward from 4 Ajaw. 
    return (daysSinceGreatCycle + 4) % 13; 
} 
[...] 

/** @return day name number in Haab calendar, e.g. it returns Yaxkin (5) for the day "14 Yaxk'in" */ 
public Haab toHaabDayName() { 
    int d = (daysSinceGreatCycle + 349) % 365; 
    return Haab.DAYS[d/20]; 
} 

/** @return day number in Haab calendar, e.g. it returns 14 for the day "14 Yaxk'in" */ 
public int toHaabDayNumber() { 
    int d = (daysSinceGreatCycle + 349) % 365; 
    return d % 20 - 1; 
} 
[...] 

/** @return Gregorian calendar representation of currently set date */ 
public String toGregorianString() { 
    Calendar c = toGregorianDate(); 
    return format.format(c.getTime()); 
} 

/** @return Converts currently defined date into Gregorian calendar */ 
public Calendar toGregorianDate() { 
    Calendar c = (Calendar)greatCycleStartDate.clone(); 
    c.add(Calendar.DAY_OF_YEAR, daysSinceGreatCycle); 
    return c; 
} 
[...] 

Dans tous les cas: question cool :-)