我有毫秒的时间,我需要以特定的可读格式向用户显示,具体取决于当前的设备配置:
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”和类似物),但是我正如我所说,我希望它尊重当前设备首选项的特定格式。如果用户使用月/日,我不想做不同的事情。
感谢。
答案 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的DateFormat
或DateUtils
类获得你想要的格式(似乎也不是常见的模式)。我相信你必须自己组装它。如果您总是希望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