一身转战三千里,一剑曾当百万师。这篇文章主要讲述基于android上的用户区域设置的日期格式相关的知识,希望能为你提供帮助。
我想根据用户区域设置显示出生日期。在我的申请中,我的一个字段是出生日期,目前的格式为dd/mm/yyyy
。因此,如果用户更改其区域设置,则日期格式也应相应更改。任何指针或代码示例都会帮助我克服这个问题。
答案您可以使用DateFormat类根据用户区域设置格式化日期。
【基于android上的用户区域设置的日期格式】例:
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
,具体取决于您希望拥有的详细程度。另一答案要根据区域设置更改日期格式,以下代码对我有用:
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 = https://www.songbingjia.com/android/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());
另一答案虽然在提出问题时接受的答案是正确的,但后来已经过时了。我正在贡献现代的答案。
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.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 8及更高版本和更新的Android设备上(来自API级别26),现代API内置。
- 在Java 6和7中获取ThreeTen Backport,现代类的后端(JST 310的ThreeTen; 请参见底部的链接)。
- 在(较旧的)Android上使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保从
org.threeten.bp
导入子包的日期和时间类。
LocalDate
:LocalDate date = LocalDate.parse(userInputString, dateFormatter);
我建议您首先格式化一个示例日期并将其显示给用户,以便他/她可以看到您的程序对他/她的语言环境所期望的格式。作为示例日期,日期是大于12的日期和大于31的年份,以便从示例中看到日,月和年的顺序(对于更长的格式,年份无关紧要,因为它将是四位数)。
如果用户以不正确的格式或无效的日期输入日期,则解析将抛出
DateTimeParseException
。抓住它并允许用户再试一次。问题:我可以在一天中的某个时间做同样的事吗?日期和时间?是。要根据用户的区域设置格式化时间,请从
DateTimeFormatter.ofLocalizedTime
获取格式化程序。对于日期和时间,一起使用DateTimeFormatter.ofLocalizedDateTime
的一个重载版本。避免使用DateFormat,SImpleDateFormat和Date类我建议你不要使用
DateFormat
,SimpleDateFormat
和Date
。这些课程的设计很差,而且已经过时了,前两个特别出了名的麻烦。而是使用LocalDate
,DateTimeFormatter
和java.time中的其他类,现代Java日期和时间API。链接
- Oracle tutorial: Date Time解释如何使用java.time。
- Java Specification Request (JSR) 310,
java.time
首次被描述。 - ThreeTen Backport project,
java.time
的后端到Java 6和7(JST-310的ThreeTen)。 - ThreeTenABP,Android版ThreeTen Backport
- Question: How to use ThreeTenABP in Android Project,有一个非常彻底的解释。
Format dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
String pattern = ((SimpleDateFormat) dateFormat).toLocalizedPattern();
之后,您可以根据模式格式化输入。
推荐阅读
- 多语言反应webapp的最佳方法
- 为什么在Android 5.0.2中I18n不工作()
- Appdynamics 4.2和4.3中的Lambda表达式支持
- 如何修复Cordova(Android)构建问题(install_failed_update_incompatible)
- 如何在Android的”打开方式”菜单中列出你的cordova应用并处理Intent事件
- 如何在Android的Cordova插件中获取上下文
- 如何知道你的应用程序是否在Cordova或Web浏览器中运行
- 如何在Cordova应用程序中检索网络(互联网连接)信息
- 如何将JSON对象从Java返回到javascript(cordova)