我想根据用户区域设置显示出生日期。在我的应用程序中,我的一个字段是出生日期,目前格式为dd/mm/yyyy
。因此,如果用户更改其区域设置,则日期格式也应相应更改。任何指针或代码示例都可以帮助我克服这个问题。
答案 0 :(得分:77)
您可以使用根据用户区域设置格式化日期的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);
您可以使用不同的方法getLongDateFormat
,getMediumDateFormat
,具体取决于您希望拥有的详细程度。
答案 1 :(得分:12)
要根据区域设置更改日期格式,以下代码对我有用:
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
答案 2 :(得分:10)
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);
答案 3 :(得分:8)
就像
一样简单日期+时间:
DateFormat format = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.SHORT, Locale.getDefault());
仅限日期:
DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());
答案 4 :(得分:1)
虽然在提出问题时接受的答案是正确的,但后来却过时了。我正在提供现代的答案。
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
是的,java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6 。
org.threeten.bp
导入日期和时间类。是的,可以。格式化程序还可用于将用户的字符串解析为LocalDate
:
LocalDate date = LocalDate.parse(userInputString, dateFormatter);
我建议您首先格式化一个示例日期,然后将其显示给用户,以便他/她可以看到您的程序在其区域设置中所期望的格式。作为示例日期,请选择一个日期,该日期的月份中的日期大于12,年份大于31,以便可以从示例中看到日期,月份和年份的顺序(对于较长的格式,年份无关紧要,因为它将是四位数)。
如果用户以错误的格式或无效的日期输入日期,则解析将抛出DateTimeParseException
。赶上它,让用户再试一次。
是的。要根据用户的语言环境格式化一天中的某个时间,请从DateTimeFormatter.ofLocalizedTime
获取格式化程序。对于日期和时间,请同时使用DateTimeFormatter.ofLocalizedDateTime
的重载版本之一。
我建议您不要使用DateFormat
,SimpleDateFormat
和Date
。这些类的设计很差,而且已经过时,尤其是前两个类非常麻烦。取而代之的是使用LocalDate
,DateTimeFormatter
和现代Java日期和时间API java.time中的其他类。
java.time
。java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。答案 5 :(得分:0)
要获取日期格式模式,您可以执行以下操作:
Format dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
String pattern = ((SimpleDateFormat) dateFormat).toLocalizedPattern();
之后,您可以按照模式设置输入格式。
答案 6 :(得分:0)
简单的方法:
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()
。
祝你好运。