Android 上基于用户语言环境的日期格式设置

我想根据用户区域设置显示出生日期。在我的应用程序中,我的一个字段是出生日期,目前的格式是 dd/mm/yyyy。因此,如果用户更改了他的区域设置,日期格式也应该相应地更改。任何指针或代码示例都可以帮助我克服这个问题。

74986 次浏览

可以使用根据用户区域设置格式化日期的 日期格式类。

例如:

String dateOfBirth = "26/02/1974";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date date = null;
try {
date = sdf.parse(dateOfBirth);
} catch (ParseException e) {
// handle exception here !
}
java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(context);
String s = dateFormat.format(date);

您可以使用不同的方法 getLongDateFormatgetMediumDateFormat,这取决于您希望具有的详细程度。

为了根据地区更改日期格式,下面的代码对我起作用:

    String dateOfBirth = "26/02/1974";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date date = null;
try {
date = sdf.parse(dateOfBirth);
} catch (ParseException e) {
// handle exception here !
}


String myString = DateFormat.getDateInstance(DateFormat.SHORT).format(date);

然后,当您更改区域设置时,日期格式将基于该区域设置进行更改。 有关日期模式的详细信息,请参阅: Http://docs.oracle.com/javase/tutorial/i18n/format/dateformat.html

Android API 提供了显示本地化日期格式的简单方法。 下面的代码可以工作。

public class FileDateUtil {
public static String getModifiedDate(long modified) {
return getModifiedDate(Locale.getDefault(), modified);
}


public static String getModifiedDate(Locale locale, long modified) {
SimpleDateFormat dateFormat = null;


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
dateFormat = new SimpleDateFormat(getDateFormat(locale));
} else {
dateFormat = new SimpleDateFormat("MMM/dd/yyyy hh:mm:ss aa");
}


return dateFormat.format(new Date(modified));
}


@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public static String getDateFormat(Locale locale) {
return DateFormat.getBestDateTimePattern(locale, "MM/dd/yyyy hh:mm:ss aa");
}
}

您可以检查以下代码。

String koreaData = FileDateUtil.getModifiedDate(Locale.KOREA, System.currentTimeMillis());
String franceData = FileDateUtil.getModifiedDate(Locale.FRENCH, System.currentTimeMillis());
String defaultData = FileDateUtil.getModifiedDate(Locale.getDefault(), System.currentTimeMillis());


String result = "Korea : " + koreaData + System.getProperty("line.separator");
result += "France : " + franceData + System.getProperty("line.separator");
result += "Default : " + defaultData + System.getProperty("line.separator");
tv.setText(result);

就这么简单

日期 + 时间:

DateFormat format = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.SHORT, Locale.getDefault());

只是约会:

DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());

要获得日期格式模式,可以这样做:

Format dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
String pattern = ((SimpleDateFormat) dateFormat).toLocalizedPattern();

之后,您可以根据模式设置输入的格式。

虽然在提出这个问题时,被接受的答案是正确的,但后来这个答案已经过时了。我提供了现代的答案。

Time 和 Three TenABP

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);
    

LocalDate dateOfBirth = LocalDate.of(1991, Month.OCTOBER, 13);
String formattedDob = dateOfBirth.format(dateFormatter);
System.out.println("Born: " + formattedDob);

它根据 JVM 的区域设置(通常从设备获取)提供不同的输出。例如:

  • 加拿大法语: Born: 91-10-13
  • 中文: Born: 1991/10/13
  • 德语: Born: 13.10.91
  • 意大利语: Born: 13/10/91

如果需要更长的格式,可以指定不同的格式样式:

  • FormatStyle.SHORT: Born: 10/13/91
  • FormatStyle.MEDIUM: Born: Oct 13, 1991
  • FormatStyle.LONG: Born: October 13, 1991
  • FormatStyle.FULL: Born: Thursday, October 13, 1991

问: 我可以在 Android 上使用 java.time 吗?

OfLocalizedDate 需要 Api O 最小值。

是的,java.time 在更老更新的 Android 设备上运行得很好。不,它不需要 API 级别26或奥利奥,即使在您的 Android 工作室的消息可能会让你认为。至少需要 爪哇6

  • 在 Java8以及更新的 Android 设备上(从 API 级别26开始) ,现代的 API 是内置的。
  • 在 Java6和 Java7中,获得 Three Ten Backport,现代类的 Backport (用于 JSR 310的 ThreeTen; 请参阅底部的链接)。
  • 在旧版本的 Android 上,要么使用 desugaring,要么使用安卓版本的 ThreeTen Backport。它叫做3TenABP。在后一种情况下,确保从 org.threeten.bp导入带有子包的日期和时间类。

问: 我是否也可以接受用户本地格式的用户输入?

格式化程序还可以用于将用户的字符串解析为 LocalDate:

    LocalDate date = LocalDate.parse(userInputString, dateFormatter);

我建议您首先设置一个示例日期的格式,并将其显示给用户,以便他/她能够看到您的程序期望他/她的语言环境使用哪种格式。举例来说,date 采用的日期是月份的日期大于12,年份大于31,这样就可以从示例中看到日期、月份和年份的顺序(对于较长的格式,年份并不重要,因为它将是4位数字)。

如果用户以不正确的格式或无效的日期输入日期,解析将抛出 DateTimeParseException。捕获它并允许用户再次尝试。

问题: 我可以在一天中的某个时间做同样的事情吗? 一个日期和时间?

是的。要根据用户的区域设置格式化一天中的某个时间,请从 DateTimeFormatter.ofLocalizedTime获取格式化程序。对于日期和时间一起使用其中一个重载版本的 DateTimeFormatter.ofLocalizedDateTime

避免使用 DateFormat、 SimpleDateFormat 和 Date 类

我建议你不要使用 DateFormatSimpleDateFormatDate。这些类的设计很差,而且早就过时了,前两类尤其是出了名的麻烦。取而代之的是使用来自 Java.time 的 LocalDateDateTimeFormatter和其他类,后者是现代的 Java 日期和时间 API。

连结

最简单的方法是:

String AR_Format = "dd-mm-yyyy";
String EN_Format = "mm-dd-yyyy";


String getFomattedDateByLocale(Date date, String locale) {
return new SimpleDateFormat(strDateFormat, new Locale(locale)).format(date);
}

然后这样说:

txtArabicDate.setText(getFomattedDateByLocale(new Date(), AR_Format));
txtEnglishDate.setText(getFomattedDateByLocale(new Date(), EN_Format));

不要忘记用自己的 date 变量替换 new Date()

祝你好运。

我的方法,例如: UTC iso 格式字符串到 android 用户。

    //string UTC instant to localDateTime
String example = "2022-01-27T13:04:23.891374801Z"
Instant instant = Instant.parse(example);
TimeZone timeZone = TimeZone.getDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, timeZone.toZoneId());


//localDateTime to device culture string output
DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG);
String strDate = localDateTime.toLocalDate().format(dateFormatter);
DateTimeFormatter timeFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM);
String strTime = localDateTime.toLocalTime().format(timeFormatter);


//strings to views
txtDate.setText(strDate);
txtTime.setText(strTime);