Android.texte.format.DateFormat " HH " n'est pas reconnu comme java.texte.SimpleDateFormat

quand j'utilise le drapeau "HH" dans android.text.format.DateFormat, il est interprété comme un " HH " littéral. Mais quand j'utilise java.text.SimpleDateFormat il est interprété comme L'heure à deux chiffres. Pourquoi sont-ils différents?

Je ne cherche pas une alternative de travail (je sais déjà que je dois utiliser kk au lieu de HH). Je suis juste curieux de savoir pourquoi " HH " n'est pas reconnu.

Java exemple:

@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
}

Sortie:

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

- je m'attendre à la fois à être 26-05-2013 22:36:34

Ne La base de données d'androïde qui a un bug?

Java SimpleDateFormat accepte ceci:

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

il semble donc que les développeurs Android ont décidé de changer la signification de k et dans leur fonction DateFormat il est équivalent au SimpleDateFormat H comme ils le disent explicitement dans leur page de documentation:

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. 

Quelle est la raison?

17
demandé sur Eric Leschinski 2013-05-27 01:45:06

5 réponses

je comprends que vous avez déjà accepté une réponse mais juste pour vous l'expliquer pleinement...

code source pour DateFormat.java...

les méthodes {@code format} de cette classe implémentent un sous-ensemble D'Unicode UTS # 35 modèles. Le sous-ensemble actuellement pris en charge par cette classe comprend les caractères de format suivants:: {@code acdEHhLKkLMmsyz}. Jusqu'au niveau 17 de L'API, seuls les {@code adEhkMmszy} étaient pris en charge. Notez que cette classe implémente incorrectement {@code k} comme s'il s'agissait de {@code H} à l'envers compatibilité.

notez la partie que j'ai marquée en gras.

la source à laquelle j'ai relié a été mise à jour pour permettre l'utilisation de H mais elle n'est pas encore en version générale (API 17 est la version actuelle D'Android et ne supporte pas H).

plus tard dans la source, au stade de la déclaration des constantes de caractères de format, il y a ceci commentaire...

/**
 * @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';

...et plus tard lors du remplacement du personnage...

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;
9
répondu Squonk 2013-05-26 22:54:50

Parce que ... ce n'est pas la même chose et elle se comporte comme le dit la documentation?

Documentation pour android.texte.format.DateFormat

cette classe ne supporte qu'un sous-ensemble de la spécification Unicode complète. Utilisez SimpleDateFormat si vous avez besoin de plus.

Mais si vous lisez la documentation de plus amples:

public static final char HOUR_OF_DAY

Cet indicateur indique l'heure de la journée au format 24 heures. Exemple pour 15h: K - > 15 exemples pour minuit: k - > 0 kk - > 00

... en utilisant cette classe, ce serait kk au lieu de HH

5
répondu Brian Roach 2013-05-26 21:57:07

pour android.texte.format.DateFormat vous désignez l'Heure en journée comme kk comme ceci:

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

pour java.texte.SimpleDateFormat vous désignez l'heure en journée comme HH.

H heure de la journée (de 0 à 23)

Documentation pour android.texte.format.DateFormat:

public static final char HOUR_OF_DAY

cet indicateur indique l'Heure de la journée en format 24 heures. Exemple pour 15h: k - > 15 Exemples pour minuit: k - > 0 kk - > 00

3
répondu msh 2013-08-17 13:43:45

je n'ai jamais programmé pour Android. J'ai googlé le DateFormat javadoc et y a vu l'exemple suivant:

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"

l'heure est marquée avec une petite lettre h face SimpleDateFormat d'où la majuscule est utilisée à cette fin.

1
répondu AlexR 2013-05-26 21:51:00

cela fonctionne pour tous les Android 4.0+ et pour deux formats de date time.

Utilisez java.texte.SimpleDateFormat.

exemple de travail:

format de 24 heures d'utilisation de cette date, le pattern = " JJ-MM-aaaa HH:mm";

format 12 heures d'utilisation de cette date, le pattern = "jj-MM-aaaa hh:mm";

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);
        }
 }
1
répondu Alex 2017-06-22 12:41:50