Android DateFormat使用特定格式*和*尊重当前用户首选项

时间:2011-11-03 04:31:56

标签: android date format

我有毫秒的时间,我需要以特定的可读格式向用户显示,具体取决于当前的设备配置:

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 ,具体取决于区域设置)。

我希望它是“ Sun 31/12 ”(或“ Sun 12/31 ”,当然是自动...)。

叫我傻,但我找不到选项(约1小时)...我只找到硬编码String格式的选项(使用那些“MM”,“HH”和类似物),但是我正如我所说,我希望它尊重当前设备首选项的特定格式。如果用户使用月/日,我不想做不同的事情。

感谢。

3 个答案:

答案 0 :(得分:2)

在您的情况下,您应该检查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 :(得分:1)

我不认为你可以从Android的DateFormatDateUtils类获得你想要的格式(似乎也不是常见的模式)。我相信你必须自己组装它。如果您总是希望DAY_OF_WEEK位于前面,那么从您获得的格式对象中获取日期格式字符串(调用toPattern()),删除年份部分(/yyyy或{{1} }),并将其与yyyy/连接起来以创建格式字符串。

答案 2 :(得分:0)

用于生成具有格式化日期/时间的字符串的实用程序类。

此类将输入格式字符串作为输入,并表示日期/时间。格式字符串控制输出的生成方式。

可以重复格式化字符以获得该字段的更详细表示。例如,格式字符“M”用于表示月份。根据角色重复的次数,您可以获得不同的表现形式。

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"

问候,Mehul Patel