6

我的日期是格式为“2013-12-31”的字符串。我想根据用户的设备设置将其转换为本地日期,但只显示月份和日期。因此,如果用户的设备设置为德语,则日期应转换为“31.12”。在德国,首先是一天,然后是月份。我不想把年份包括在内。

4

6 回答 6

4

因为Build.VERSION.SDK_INT < 18我找不到一种方法来获得符合用户偏好的月/日格式。如果您愿意以用户的语言环境默认模式(不是他们的首选顺序或格式)接受月/日,则此答案有效。我的实现在低于 18 的版本中使用完整的数字格式,或者如果在以下精心编程的一系列步骤中遇到任何问题。

  1. 以字符串形式获取用户的数字日期格式模式
  2. 将模式简化为没有符号或年份的骨架格式
  3. 使用 DateFormat.getBestDateTimePattern 获取本地化的月/日格式
  4. 根据用户首选顺序重新排序本地化的月/日格式。(关键假设:天和月可以天真地交换为所有本地化的数字格式)

这应该会导致在本地化格式中遵循用户偏好的月/日模式。


根据此答案获取用户日期模式字符串:

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);
于 2015-01-05T17:52:32.827 回答
2

我认为,这是针对 API > 17 的应用程序的最简单解决方案:

dateFormat = SimpleDateFormat(DateFormat.getBestDateTimePattern(Locale.getDefault(), "MMMM dd"), Locale.getDefault())
于 2018-10-03T10:53:20.237 回答
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;
}

让我知道您可能对解决方案提出的任何问题。

于 2016-07-21T16:01:38.937 回答
1

保持简单,我们已经有一个方法(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

于 2019-07-18T11:46:07.870 回答
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);
于 2013-10-22T15:37:49.197 回答
-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();
    }
于 2013-10-22T15:39:46.550 回答