我的日期是“2013-12-31”格式的字符串。我想根据用户的设备设置将其转换为本地日期,但仅显示月份和日期。因此,如果用户的设备设置为德语,则日期应转换为“31.12”。在德国,首先是一个月,然后是一个月。我不希望将这一年包括在内。
答案 0 :(得分:4)
对于Build.VERSION.SDK_INT < 18
,我无法找到一种方法来获取符合用户偏好的月/日格式。如果您愿意接受用户的语言环境默认模式(不是他们的首选顺序或格式)的月/日,则This answer有效。我的实现在小于18的版本中使用完整的数字格式,或者在以下精心编程的一系列步骤中遇到任何问题。
这应该会产生一个月/日模式,它遵循用户在本地化格式中的偏好。
按this answer获取用户日期模式字符串:
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's和'M'。
这里的关键假设是天和月可以天真地交换所有本地化的数字格式。
DateFormat monthDayFormat = new SimpleDateFormat(workingFormat);
答案 1 :(得分:1)
有点晚了,我也遇到了同样的问题。这就是我解决它的方式:
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;
}
让我知道您可能遇到的与解决方案相关的任何问题。
答案 2 :(得分:1)
我认为,这是针对API> 17的应用程序的最简单解决方案:
dateFormat = SimpleDateFormat(DateFormat.getBestDateTimePattern(Locale.getDefault(), "MMMM dd"), Locale.getDefault())
答案 3 :(得分:0)
这有效:
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);
答案 4 :(得分:0)
保持简单,我们已经有一种方法(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
答案 5 :(得分:-1)
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();
}