Formatage de la date et de l'heure en fonction des paramètres régionaux
Je suis nouveau dans les deux Java et Android donc cela peut être une question stupide, mais je cherche depuis des jours maintenant et je ne trouve pas une solution:
J'essaie de sortir un Java.util.Date
selon les paramètres régionaux de l'utilisateur.
La recherche sur StackOverflow m'amène à ceci:
Java.util.Date date = new Date();
String dateString = DateFormat.getDateFormat(getApplicationContext()).format(date);
Cela produit:
20/02/2011
Sur mon téléphone localisé en français. Presque bien.
Comment puis-je également afficher les heures, minutes et secondes du Date
, en utilisant les paramètres régionaux de l'utilisateur? J'ai cherché dans la documentation Android mais je n'ai rien trouvé.
Merci beaucoup.
Utilisez Android.text.format.DateFormat.getTimeFormat()
réf: http://developer.Android.com/reference/Android/text/format/DateFormat.html
tl; dr
ZonedDateTime // Represent a moment as seen in the wall-clock time used by the people of a particular region (a time zone).
.now( ZoneId.of( "Asia/Kolkata" ) ) // Capture the current moment as seen in the specified time zone. Returns a `ZonedDateTime` object.
.format( // Generate text representing the value of this `ZonedDateTime` object.
DateTimeFormatter // Class controlling the generation of text representing the value of a date-time object.
.ofLocalizedDateTime ( FormatStyle.FULL ) // Automatically localize the string representing this date-time value.
.withLocale ( Locale.FRENCH ) // Specify the human language and cultural norms used in localizing.
) // Return a `String` object.
Java.time
Le code de la question utilise d'anciennes classes de date-heure gênantes, désormais héritées, supplantées par les classes Java.time intégrées à Java 8 et versions ultérieures).
Les paramètres régionaux et le fuseau horaire n'ont rien à voir l'un avec l'autre. Les paramètres régionaux déterminent le langage humain et les normes culturelles utilisés lors de la génération d'une chaîne pour représenter une valeur date-heure. Le fuseau horaire détermine l'heure d'horloge murale d'une région particulière utilisée pour représenter un moment sur la chronologie.
La classe Instant
représente un moment de la chronologie dans [~ # ~] utc [~ # ~] avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).
Instant instant = Instant.now();
2016-10-12T07: 21: 00.264Z
Appliquez un fuseau horaire pour obtenir un ZonedDateTime
. J'ai choisi arbitrairement d'afficher ce moment en utilisant le fuseau horaire de l'Inde. Même moment, même point sur la timeline.
ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = instant.atZone( z );
2016-10-12T12: 51: 00.264 + 05: 30 [Asie/Kolkata]
Générez une chaîne en utilisant les paramètres régionaux de Québec Canada. Laissez Java.time localiser automatiquement la chaîne.
Locale l = Locale.CANADA_FRENCH;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL ).withLocale ( l );
String output = zdt.format ( f ); // Indian time zone with Québécois presentation/translation.
mercredi 12 octobre 2016 12 h 51 IST
À propos de Java.time
Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent l'ancien héritage gênant classes date-heure telles que Java.util.Date
, .Calendar
, & Java.text.SimpleDateFormat
.
Le projet Joda-Time , désormais en mode de maintenance , conseille la migration vers Java.time.
Pour en savoir plus, consultez le Oracle Tutorial . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Où obtenir les classes Java.time?
- Java SE 8 et SE 9 et versions ultérieures
- Intégré.
- Fait partie de la norme Java avec une implémentation groupée.
- Java 9 ajoute quelques fonctionnalités et correctifs mineurs.
- Java SE 6 et SE 7
- Une grande partie de la fonctionnalité Java.time est backportée vers Java 6 & 7 in ThreeTen-Backport .
- Android
- Le projet ThreeTenABP s'adapte ThreeTen-Backport (mentionné ci-dessus) pour Android spécifiquement.
- Voir Comment utiliser… .
Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour de futurs ajouts possibles à Java.time. Vous pouvez trouver ici des classes utiles telles que Interval
, YearWeek
, YearQuarter
et plus .
Java.text.DateFormat
Possède toutes les fonctions dont vous pourriez avoir besoin:
DateFormat.getDateInstance()
DateFormat.getTimeInstance()
Mais celui dont vous avez besoin est:
DateFormat.getDateTimeInstance()
Vous pouvez également spécifier la longueur de la partie date/heure et les paramètres régionaux. Le résultat final serait:
DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT, Locale.FRENCH).format(Date);
Source: http://docs.Oracle.com/javase/7/docs/api/Java/text/DateFormat.html
DateFormat.getTimeInstance()
obtient le formateur d'heure avec le style de formatage par défaut pour les paramètres régionaux par défaut. Vous pouvez également passer un style et un Locale
.
public static String formatDate(Date date, boolean withTime)
{
String result = "";
DateFormat dateFormat;
if (date != null)
{
try
{
String format = Settings.System.getString(context.getContentResolver(), Settings.System.DATE_FORMAT);
if (TextUtils.isEmpty(format))
{
dateFormat = Android.text.format.DateFormat.getDateFormat(context);
}
else
{
dateFormat = new SimpleDateFormat(format);
}
result = dateFormat.format(date);
if (withTime)
{
dateFormat = Android.text.format.DateFormat.getTimeFormat(context);
result += " " + dateFormat.format(date);
}
}
catch (Exception e)
{
}
}
return result;
}
Utilisez getBestDateTimePattern()
DateFormat.getBestDateTimePattern()
à partir du package Android.text.format
crée la meilleure date et heure possible en fonction des paramètres régionaux définis par l'utilisateur.
Par exemple: le squelette EEEE, MMM d, YYYY, jj:mm
Renvoie la date et l'heure localisées comme suit.
Locale English (India): Monday 9 Sep 2019, 9:33 PM
Locale English (United States): Monday, Sep 9, 2019, 9:33 PM
Locale español (Estados Unidos): lunes, 9 de sep. de 2019 9:33 PM
Locale español (México): lunes, 9 de sep de 2019 21:33
Locale français (France): lundi 9 sept. 2019 à 21:33
Locale português (Brasil): segunda-feira, 9 de set de 2019 21:33
et ainsi de suite pour différents paramètres régionaux. Il respecte également le format d'heure 12 ou 24 heures des paramètres régionaux.
Pour personnaliser votre propre squelette, reportez-vous au modèle TS # 35 sur unicode.org.
Exemple de code
Voici l'exemple de code testé dans Kotlin:
val skeleton = DateFormat.getBestDateTimePattern(Locale.getDefault(), "EEEE, MMM d, YYYY, jj:mm")
val formatter = SimpleDateFormat(skeleton, Locale.getDefault()).apply {
timeZone = TimeZone.getDefault()
applyLocalizedPattern(skeleton)
}
val dateTimeText = formatter.format(calendar.time)
Log.d("YourClass", "Locale ${Locale.getDefault().displayName}: $dateTimeText")
Au lieu de la classe Calendar
, vous pouvez également utiliser ZonedDateTime
. Il suffit de le convertir en objet Date
et de le donner à format()
. Par exemple: Date(zonedDateTime.toInstant().toEpochMilli())
J'espère que cela pourra aider.