将日期格式化为本地设置,但仅限于月和日

时间:2013-10-22 14:50:53

标签: android date

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

6 个答案:

答案 0 :(得分:4)

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

  1. 将用户的数字日期格式模式设为String
  2. 将图案缩小为骨架格式,不带符号或年数
  3. 使用DateFormat.getBestDateTimePattern
  4. 获取本地化的月/日格式
  5. 根据用户首选订单重新排序本地化的月/日格式。 (关键假设:天和月可以天真地换成所有本地化的数字格式)
  6. 这应该会产生一个月/日模式,它遵循用户在本地化格式中的偏好。


    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();
    }