2014-08-31 9 views
10

Seit seinem ersten Datum Ich war die statische Methode Calendar.getInstance() verwenden bekommt ein neues Kalender Objekt ersetzen eingeführt wurde. Ich hatte nie ein Problem, aber ich fragte mich nur aus irgendeinem Grund, ob es besser wäre, stattdessen die Methode GregorianCalendar.getInstance() zu verwenden.Unterschied zwischen Calendar.getInstance() und GregorianCalendar.getInstance()

Ist es möglich, dass meine Programme in einem bestimmten Gebietsschema oder einer JVM irgendwo ausgeführt werden, wo die Superklassenversion eine Objektklasse zurückgibt, die ich nicht erwartet habe? Hat es jemals eine Implementierung von Kalenderanders alsGregorianCalendar das jemals es in breite Verwendung gemacht?

Wie gesagt, ich habe momentan kein Problem, aber ich versuche immer, meine Praxis zu verbessern.

+5

In Thailand ist der buddhistische Kalender bevorzugt und wird von 'Calendar.getInstance()' zurückgegeben. Wenn Sie sicherstellen möchten, dass Sie den Gregorianischen Kalender erhalten, sollten Sie immer einen Konstruktor dieser Klasse verwenden, nicht die statische Factory-Methode 'getInstance()'. –

Antwort

8

Ja, Kalender könnte einen länderspezifischen Kalender zurückgeben. Von der Quelle.

/** 
* Gets a calendar using the default time zone and locale. The 
* <code>Calendar</code> returned is based on the current time 
* in the default time zone with the default 
* {@link Locale.Category#FORMAT FORMAT} locale. 
* 
* @return a Calendar. 
*/ 
public static Calendar getInstance() 
{ 
    return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT)); 
} 

private static Calendar createCalendar(TimeZone zone, 
             Locale aLocale) 
{ 
    CalendarProvider provider = 
     LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale) 
          .getCalendarProvider(); 
    if (provider != null) { 
     try { 
      return provider.getInstance(zone, aLocale); 
     } catch (IllegalArgumentException iae) { 
      // fall back to the default instantiation 
     } 
    } 

    Calendar cal = null; 

    if (aLocale.hasExtensions()) { 
     String caltype = aLocale.getUnicodeLocaleType("ca"); 
     if (caltype != null) { 
      switch (caltype) { 
      case "buddhist": 
      cal = new BuddhistCalendar(zone, aLocale); 
       break; 
      case "japanese": 
       cal = new JapaneseImperialCalendar(zone, aLocale); 
       break; 
      case "gregory": 
       cal = new GregorianCalendar(zone, aLocale); 
       break; 
      } 
     } 
    } 
    if (cal == null) { 
     // If no known calendar type is explicitly specified, 
     // perform the traditional way to create a Calendar: 
     // create a BuddhistCalendar for th_TH locale, 
     // a JapaneseImperialCalendar for ja_JP_JP locale, or 
     // a GregorianCalendar for any other locales. 
     // NOTE: The language, country and variant strings are interned. 
     if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") { 
      cal = new BuddhistCalendar(zone, aLocale); 
     } else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja" 
        && aLocale.getCountry() == "JP") { 
      cal = new JapaneseImperialCalendar(zone, aLocale); 
     } else { 
      cal = new GregorianCalendar(zone, aLocale); 
     } 
    } 
    return cal; 
} 
+0

BuddhistCalendar-Klasse ist in Android nicht verfügbar. Kannst du mir helfen, woher du diese Klasse bekommst und wie du Datum und Uhrzeit einstellen kannst? – Pratik

+0

@Pratik Ich habe keine Ahnung. –

+1

@Pratik Android! = Java, siehe auch [mein Beitrag] (http://Stackoverflow.com/a/36773726/2491410) über nicht-gregorianische Kalender auf Android –