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
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.
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
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?
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;
}
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.
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.