Android DateFormat использует определенный формат * и * с учетом текущих пользовательских настроек - PullRequest
0 голосов
/ 03 ноября 2011

У меня есть время в миллисекундах, и мне нужно отобразить его пользователю в определенном читаемом формате, в зависимости от текущей конфигурации устройства:

java.text.DateFormat mDateFormat = android.text.format.DateFormat.getDateFormat(this.getApplicationContext());
java.text.DateFormat mTimeFormat = android.text.format.DateFormat.getTimeFormat(this.getApplicationContext());

Я использую String mDateFormat.format(java.util.Date myFooDate), чтобы получить его.

Однако возвращается только « 31/12/2011 » (или 12/31/2011 в зависимости от локали).

Я хотел этобыть " ВС 31/12 " (или " ВС 12/31 ", автоматически, конечно ...).

Называть меня глупым, но я не могне могу найти опцию (~ 1 час) ... Я нашел опцию только для жесткого кодирования формата String (используя те "MM", "HH" и аналогичные), но я, как я уже сказал, хочу, чтобы его уважалитекущие настройки устройства в этом конкретном формате .Если пользователь использует месяц / дату, я не хочу делать иначе.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 03 ноября 2011

В вашем случае вам следует проверить значение mDateFormat.Если это SimpleDateFormat , вы можете привести mDateFormat к SimpleDateFormat и вызвать метод toPattern().Затем проверьте, сопровождается ли заглавная буква M в результирующей строке буквой D в нижнем регистре (не обязательно сразу) или наоборот.Это может помочь определить используемый вами формат.

Вот полный исходный код.Я размещаю его в открытом доступе.

public static boolean isMonthBeforeDay(DateFormat df){
    if(df instanceof SimpleDateFormat){
        SimpleDateFormat sdf=(SimpleDateFormat)df;
        String pattern=sdf.toPattern();
        int i=0;
        int dayFound=-1;
        int monthFound=-1;
        while(i<pattern.length()){
            if(pattern.charAt(i)=='\''){
                // Ignore quoted text
                i++;
                while(i<pattern.length()){
                    if(pattern.charAt(i)=='\''){
                        // Possible end of quoted text
                        if(i+1>=pattern.length())
                            break;
                        else if(pattern.charAt(i+1)=='\''){
                            i++;
                        } else {
                            i++;
                            break;
                        }
                    }
                    i++;
                }
                continue;
            }
            if(pattern.charAt(i)=='M' && monthFound<0){
                monthFound=i;
            }
            else if(pattern.charAt(i)=='d' && dayFound<0){
                dayFound=i;
            }
            i++;
        }
        if(monthFound>=0 && dayFound>=0){
            // Found both month and day in pattern
            return (monthFound<dayFound);
        }
        // Assume true, you can change to false if you want
        // the day to come before the month by default
        return true;
    } else {
        StringBuffer sb=new StringBuffer();
        FieldPosition fpMonth=new FieldPosition(DateFormat.MONTH_FIELD);
        FieldPosition fpDay=new FieldPosition(DateFormat.DATE_FIELD);
        GregorianCalendar gc=new GregorianCalendar(2000,0,20);
        Date d=gc.getTime();
        // Find the field position of the month
        df.format(d,sb,fpMonth);
        sb.delete(0, sb.length());
        // Find the field position of the day
        df.format(d,sb,fpDay);
        return fpMonth.getBeginIndex()<fpDay.getBeginIndex();
    }
}
1 голос
/ 03 ноября 2011

Я не думаю, что вы можете получить желаемый формат (не кажется, что это также является общим шаблоном) из классов Android DateFormat или DateUtils. Я верю, что тебе придется собрать его самостоятельно. Если вы всегда хотите, чтобы ваш DAY_OF_WEEK был впереди, то тривиально взять строку формата даты из полученного вами объекта формата (вызов toPattern()), удалить часть года (/yyyy или yyyy/) и объединить ее с EEE для создания строки формата.

0 голосов
/ 03 ноября 2011

Класс утилит для создания строк с форматированной датой / временем.

Этот класс принимает в качестве входных данных строку формата и представление даты / времени. Строка формата управляет тем, как генерируется вывод.

Форматирование символов может повторяться для получения более подробного представления этого поля. Например, символ формата «М» используется для представления месяца. В зависимости от того, сколько раз этот символ повторяется, вы получаете другое представление.

For the month of September:

M -> 9

MM -> 09

MMM -> Sep

MMMM -> September

Эффекты дублирования различаются в зависимости от природы поля. См. Примечания к отдельным полевым форматерам для деталей. Для чисто числовых полей, таких как HOUR, добавление большего количества копий указателя приведет к нулю значения этого числа символов.

For 7 minutes past the hour:

m -> 7

mm -> 07

mmm -> 007

mmmm -> 0007

А

Examples for April 6, 1970 at 3:23am:

"MM/dd/yy h:mmaa" -> "04/06/70 3:23am"

"MMM dd, yyyy h:mmaa" -> "Apr 6, 1970 3:23am"

"MMMM dd, yyyy h:mmaa" -> "April 6, 1970 3:23am"

"E, MMMM dd, yyyy h:mmaa" -> "Mon, April 6, 1970 3:23am&

"EEEE, MMMM dd, yyyy h:mmaa" -> "Monday, April 6, 1970 3:23am"

"'Noteworthy day: 'M/d/yy" -> "Noteworthy day: 4/6/70"

С уважением, Мехул Патель

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...