2014-08-31 23 views
10

Kể từ khi nó lần đầu tiên được giới thiệu để thay thế ngày Tôi đã sử dụng phương pháp tĩnh Calendar.getInstance() để có được một Lịch đối tượng mới. Tôi chưa bao giờ có một vấn đề nhưng tôi chỉ tự hỏi vì một lý do nào đó nếu sử dụng phương pháp GregorianCalendar.getInstance() để thay thế.Sự khác nhau giữa Calendar.getInstance() và GregorianCalendar.getInstance()

Có thể chương trình của tôi sẽ chạy ở một số miền địa phương hoặc một số JVM ở đâu đó mà phiên bản siêu lớp sẽ trả về lớp đối tượng mà tôi không mong đợi? Đã bao giờ triển khai Lịchkhác vớiGregorianCalendar đã từng sử dụng rộng rãi chưa?

Như tôi đã nói tôi không gặp vấn đề gì vào lúc này nhưng tôi luôn tìm cách cải thiện thực tiễn của mình.

+5

Ở Thái Lan, lịch buddhist được ưu tiên và sẽ được trả về bởi 'Calendar.getInstance()'. Nếu bạn muốn chắc chắn rằng bạn có được lịch gregorian, bạn nên luôn luôn sử dụng một hàm tạo của lớp đó, không phải phương thức nhà máy tĩnh 'getInstance()'. –

Trả lời

8

Có, Lịch có thể trả lại lịch địa phương cụ thể. Từ nguồn.

/** 
* 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

Lớp BuddhistCalendar không khả dụng trong Android. Bạn có thể giúp tôi từ đâu để có được lớp học này và làm thế nào để thiết lập ngày và giờ? – Pratik

+0

@Pratik Tôi không biết. –

+1

@Pratik Android! = Java, xem thêm [bài đăng của tôi] (http://stackoverflow.com/a/36773726/2491410) về lịch không phải người theo dõi trên Android –

Các vấn đề liên quan