68

我想根据用户语言环境显示出生日期。在我的申请中,我的字段之一是出生日期,目前格式为dd/mm/yyyy. 所以如果用户改变了他的语言环境,日期格式也应该相应地改变。任何指针或代码示例都会真正帮助我克服这个问题。

4

8 回答 8

96

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

例子:

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具体取决于您想要的详细程度。

于 2012-06-19T02:21:44.890 回答
37

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

java.time 和 ThreeTenABP

    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.SHORTBorn: 10/13/91
  • FormatStyle.MEDIUMBorn: Oct 13, 1991
  • FormatStyle.LONGBorn: October 13, 1991
  • FormatStyle.FULLBorn: Thursday, October 13, 1991

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

DateTimeFormatter.ofLocalizedDate 至少需要 Api O。

是的,java.time 在较旧和较新的 Android 设备上运行良好。不,它不需要 API 级别 26 或 Oreo,即使您的 Android Studio 中的消息可能让您这么认为。它只需要至少Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。
  • 在 Java 6 和 7 中获得 ThreeTen Backport,现代类的后向端口(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在较旧的 Android 上,要么使用脱糖,要么使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。在后一种情况下,请确保您从org.threeten.bp子包中导入日期和时间类。

问题:我还可以接受用户本地格式的用户输入吗?

是的你可以。格式化程序还可用于将来自用户的字符串解析为LocalDate

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

我建议您首先格式化一个示例日期并将其显示给用户,以便他/她可以看到您的程序期望他/她的语言环境采用哪种格式。作为示例日期,日期的日期大于 12,年份大于 31,因此可以从示例中看到日、月和年的顺序(对于较长的格式,年份无关紧要,因为它将是四位数)。

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

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

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

避免使用 DateFormat、SIMpleDateFormat 和 Date 类

我建议你不要使用DateFormat,SimpleDateFormatDate. 这些类设计不佳且早已过时,前两个尤其是出了名的麻烦。而是使用LocalDate,DateTimeFormatter和 java.time 中的其他类,现代 Java 日期和时间 API。

链接

于 2019-06-19T13:27:17.837 回答
21

简单到

对于日期+时间:

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

仅日期:

DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());
于 2017-09-18T18:17:04.853 回答
14

要根据语言环境更改日期格式,以下代码对我有用:

    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

于 2015-03-17T18:53:41.880 回答
12

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);
于 2016-06-25T04:29:12.363 回答
1

简单的方法:

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));

不要忘记new Date()用您自己的日期变量替换。

祝你好运。

于 2021-01-16T13:15:03.573 回答
0

要获取日期格式模式,您可以执行以下操作:

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

之后,您可以根据模式格式化输入。

于 2018-09-13T07:45:50.907 回答
0

我的方式,例如: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);
于 2022-01-29T11:38:00.950 回答