Android.text.format.DateFormat "HH" wird nicht wie mit java.text.SimpleDateFormat erkannt

Wenn ich die "HH" -Flagge in android.text.format.DateFormat , wird sie als wörtliche "HH" interpretiert. Aber wenn ich java.text.SimpleDateFormat , wird es als die 2-stellige Stunde interpretiert. Warum sind sie anders?

Ich bin nicht auf der Suche nach einer funktionierenden Alternative (ich weiß bereits, dass ich kk anstelle von HH ). Ich bin nur neugierig, warum "HH" nicht erkannt wird.

  • Wie bekomme ich landspezifische Ergebnisse in Google Places API für AutocompletePredictions in Android?
  • Programmieren Sie das Bluetooth-Gerät programmgesteuert, ohne dass der Benutzer den Pin eingibt
  • Best Practices für den Beitritt von Tischen und Benachrichtigung von ContentObservers in Android ContentProvider
  • Wie behält Google Keep Spracherkennung bei gleichzeitiger Speicherung der Audioaufnahme?
  • Warum fügt Eclipse automatisch eine Appcompat v7-Bibliotheksunterstützung hinzu, wenn ich ein neues Projekt anlege?
  • Wie man eine Karte löscht (mit appcompat v7's CardView)
  • Java Beispiel:

     @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Calendar calendar = Calendar.getInstance(); String dateJava = new java.text.SimpleDateFormat( "dd-MM-yyyy HH:mm:ss").format(calendar.getTime()); String dateAndroid = android.text.format.DateFormat.format( "dd-MM-yyyy HH:mm:ss", calendar).toString(); TextView tvAndroid = (TextView) findViewById(R.id.tvAndroid); TextView tvJava = (TextView) findViewById(R.id.tvJava); tvAndroid.setText("Android: " + dateAndroid); //prints 26-05-2013 HH:36:34 tvJava.setText("Java: " + dateJava); //prints 26-05-2013 22:36:34 } 

    Ausgang ist:

     Android: 26-05-2013 HH:36:34 Java: 26-05-2013 22:36:34 

    Ich erwarte beide 26-05-2013 22:36:34

    Hat Android DateFormat einen Bug?

    Java SimpleDateFormat akzeptiert diese:

     H Hour in day (0-23) Number 0 k Hour in day (1-24) Number 24 K Hour in am/pm (0-11) Number 0 h Hour in am/pm (1-12) Number 12 

    So scheint es, dass die Android-Entwickler beschlossen haben, die Bedeutung von k zu ändern und in ihrer DateFormat-Funktion ist es gleichbedeutend mit dem SimpleDateFormat H wie sie explizit in ihrer Dokumentationsseite sagen:

     This constant was deprecated in API level 18. Use a literal 'H' (for compatibility with SimpleDateFormat and Unicode) or 'k' (for compatibility with Android releases up to and including Jelly Bean MR-1) instead. Note that the two are incompatible. 

    Was ist der Grund dafür?

  • Gradle 0.9. + / 0.9.2 error: Klasse kann nicht geladen werden 'com.android.builder.testing.api.DeviceProvider'
  • Kann keinen Handler in Thread erstellen, der nicht Looper.prepare () in AsyncTask für ProgressDialog aufgerufen hat
  • Android JUnit Testing ... Wie man eine Ausnahme erwartet
  • Unterschied zwischen glOrthof und glViewPort
  • Android EditText onClickListener
  • Mdpi Bild ist zu klein für 10 "Android Tablette
  • 5 Solutions collect form web for “Android.text.format.DateFormat "HH" wird nicht wie mit java.text.SimpleDateFormat erkannt”

    Ich verstehe, dass du schon eine Antwort akzeptiert hast, aber um dir das ganz zu erklären …

    Aus dem Quellcode für DateFormat.java …

    Die Methoden {@code format} in dieser Klasse implementieren eine Untermenge von Unicode UTS # 35 Patterns. Die derzeit von dieser Klasse unterstützte Untermenge enthält die folgenden Formatzeichen: {@code acdEHhLKkLMmsyz}. Bis zur API-Stufe 17 wurde nur {@code adEhkMmszy} unterstützt. Beachten Sie, dass diese Klasse falsch implementiert {@code k}, als ob es {@code H} für Rückwärtskompatibilität wäre.

    Beachten Sie den Teil, den ich fett markiert habe.

    Die Quelle, die ich verknüpft habe, wurde aktualisiert, um die Verwendung von H zu erlauben, aber es ist nicht auf allgemeiner Freigabe (API 17 ist die gegenwärtige Version von Android und stützt nicht H).

    Später in der Quelle, in der Phase der Deklaration der Format Zeichen Konstanten, gibt es diesen Kommentar …

     /** * @deprecated Use a literal {@code 'H'} (for compatibility with {@link SimpleDateFormat} * and Unicode) or {@code 'k'} (for compatibility with Android releases up to and including * Jelly Bean MR-1) instead. Note that the two are incompatible. */ @Deprecated public static final char HOUR_OF_DAY = 'k'; 

    … und später beim Charakterwechsel …

     case 'H': // hour in day (0-23) case 'k': // hour in day (1-24) [but see note below] { int hour = inDate.get(Calendar.HOUR_OF_DAY); // Historically on Android 'k' was interpreted as 'H', which wasn't // implemented, so pretty much all callers that want to format 24-hour // times are abusing 'k'. http://b/8359981. if (false && c == 'k' && hour == 0) { hour = 24; } replacement = zeroPad(hour, count); } break; 

    Denn … es ist nicht dasselbe und es verhält sich wie die Dokumentation?

    Aus der Dokumentation für android.text.format.DateFormat

    Diese Klasse unterstützt nur eine Teilmenge der vollständigen Unicode-Spezifikation. Verwenden Sie SimpleDateFormat, wenn Sie mehr benötigen.

    Aber wenn du die docs weiter liest :

    Public static final char HOUR_OF_DAY

    Dieser Bezeichner zeigt die Stunde des Tages im 24-Stunden-Format an. Beispiel für 15 Uhr: k -> 15 Beispiele für Mitternacht: k -> 0 kk -> 00

    Also … mit dieser Klasse, wäre es kk statt HH

    Für android.text.format.DateFormat bezeichnen Sie Stunde im Tag wie kk wie folgt:

     String dateAndroid = android.text.format.DateFormat.format( "dd-MM-yyyy kk:mm:ss", calendar).toString(); 

    Für java.text.SimpleDateFormat bezeichnen Sie Stunde am Tag als HH .

    H Stunde am Tag (0-23)

    Dokumentation für android.text.format.DateFormat:

    Public static final char HOUR_OF_DAY

    Dieser Bezeichner zeigt die Stunde des Tages im 24-Stunden-Format an. Beispiel für 15 Uhr: k -> 15 Beispiele für Mitternacht: k -> 0 kk -> 00

    Ich habe noch nie für Android programmiert. Ich googelte die DateFormat javadoc und sah dort die folgenden Beispiele:

     Examples for April 6, 1970 at 3:23am: "MM/dd/yy h:mmaa" -> "04/06/70 3:23am" "MMM dd, yyyy h:mmaa" -> "Apr 6, 1970 3:23am" "MMMM dd, yyyy h:mmaa" -> "April 6, 1970 3:23am" "E, MMMM dd, yyyy h:mmaa" -> "Mon, April 6, 1970 3:23am& "EEEE, MMMM dd, yyyy h:mmaa" -> "Monday, April 6, 1970 3:23am" "'Noteworthy day: 'M/d/yy" -> "Noteworthy day: 4/6/70" 

    Die "Stunde" wird mit dem kleinen Buchstaben h im Gegensatz zu SimpleDateFormat markiert, wo hierfür Großbuchstaben verwendet werden.

    Diese Arbeit für alle Android 4.0+ und für zwei Datum Zeitformat.

    Verwenden Sie java.text.SimpleDateFormat.

    Beispiel:

    24-Stunden-Format verwenden dieses Datumsmuster = " dd-MM-yyyy HH: mm ";

    12 Stunden Format verwenden dieses Datum Muster = " dd-MM-yyyy hh: mm a ";

     public static String getDateAsString(Date date, String pattern) { Locale locale = new Locale("EN"); SimpleDateFormat sdf = null; try { sdf = new SimpleDateFormat(pattern, locale); return sdf.format(date); } catch (IllegalArgumentException ex) { // default format sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm", locale); return sdf.format(date); } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.