我的日期是格式为“2013-12-31”的字符串。我想根据用户的设备设置将其转换为本地日期,但只显示月份和日期。因此,如果用户的设备设置为德语,则日期应转换为“31.12”。在德国,首先是一天,然后是月份。我不想把年份包括在内。
6 回答
因为Build.VERSION.SDK_INT < 18
我找不到一种方法来获得符合用户偏好的月/日格式。如果您愿意以用户的语言环境默认模式(不是他们的首选顺序或格式)接受月/日,则此答案有效。我的实现在低于 18 的版本中使用完整的数字格式,或者如果在以下精心编程的一系列步骤中遇到任何问题。
- 以字符串形式获取用户的数字日期格式模式
- 将模式简化为没有符号或年份的骨架格式
- 使用 DateFormat.getBestDateTimePattern 获取本地化的月/日格式
- 根据用户首选顺序重新排序本地化的月/日格式。(关键假设:天和月可以天真地交换为所有本地化的数字格式)
这应该会导致在本地化格式中遵循用户偏好的月/日模式。
根据此答案获取用户日期模式字符串:
java.text.DateFormat shortDateFormat = DateFormat.getDateFormat(context);
if (shortDateFormat instanceof SimpleDateFormat) {
String textPattern = ((SimpleDateFormat) shortDateFormat).toPattern();
}
通过删除不是“d”或“M”的所有字符,将模式简化为日/月骨架,示例结果:
String skeletonPattern = 'ddMM'
获取本地化的月/日格式:
String workingFormat = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeletonPattern);
(注意:此方法需要 api 18 及更高版本,并且不会以用户首选的顺序或格式返回值,因此这个冗长的答案):
从此方法获取用户首选日期顺序('M'、'd'、'y'):
char[] order = DateFormat.getDateFormatOrder(context);
(注意:我想您也可以解析原始模式以获取此信息)
如果workingFormat
顺序正确,您的工作就完成了。否则,切换模式中的“d”和“M”。这里的关键假设是天和月可以天真地交换为所有本地化的数字格式。
DateFormat monthDayFormat = new SimpleDateFormat(workingFormat);
我认为,这是针对 API > 17 的应用程序的最简单解决方案:
dateFormat = SimpleDateFormat(DateFormat.getBestDateTimePattern(Locale.getDefault(), "MMMM dd"), Locale.getDefault())
有点晚了,我也遇到了同样的问题。我就是这样解决的:
String dayMonthDateString = getDayMonthDateString("2010-12-31", "yyyy-MM-dd", Locale.GERMANY);
Log.i("customDate", "dayMonthDateString = " + dayMonthDateString);
private String getDayMonthDateString(String dateString, String dateFormatString, Locale locale)
{
try
{
boolean dayBeforeMonth = defineDayMonthOrder(locale);
String calendarDate = dateString;
SimpleDateFormat dateFormat = new SimpleDateFormat(dateFormatString);
Date date = dateFormat.parse(calendarDate);
SimpleDateFormat newDateFormat;
if (dayBeforeMonth)
{
newDateFormat = new SimpleDateFormat("dd.MM", locale);
}
else
{
newDateFormat = new SimpleDateFormat("MM.dd", locale);
}
return newDateFormat.format(date);
}
catch (ParseException e)
{
e.printStackTrace();
}
return null;
}
private boolean defineDayMonthOrder(Locale locale) throws ParseException
{
String day = "10";
String month = "11";
String year = "12";
String calendarDate = day + "." + month + "." + year;
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yy");
Date date = format.parse(calendarDate);
String localizedDate = SimpleDateFormat.getDateInstance(SimpleDateFormat.SHORT, locale).format(date);
int indexOfDay = localizedDate.indexOf(day);
int indexOfMonth = localizedDate.indexOf(month);
return indexOfDay < indexOfMonth ? true : false;
}
让我知道您可能对解决方案提出的任何问题。
保持简单,我们已经有一个方法(API 18+):
String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), "yyyy-MM-dd");
SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.getDefault());
String output = format.format(currentTimeMs);
今天是 2019 年 7 月 18 日:
在欧洲,产量将是
18.07.2019
在美国,输出将是:
07/18/2019
这有效:
String dtStart = "2010-12-31";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(dtStart);
SimpleDateFormat df = (SimpleDateFormat)
DateFormat.getDateInstance(DateFormat.SHORT);
String pattern = df.toLocalizedPattern().replaceAll(".?[Yy].?", "");
System.out.println(pattern);
SimpleDateFormat mdf = new SimpleDateFormat(pattern);
String localDate = mdf.format(date);
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat outputFormat = new SimpleDateFormat("dd.MM");
try {
Date date = inputFormat.parse("2013-12-31");
String out = outputFormat.format(date);
// out is 31.12
} catch (ParseException e) {
e.printStackTrace();
}