android.text.format.DateFormat“;HH";与java.text.simpleDataFormat不同,无法识别
当我在android.text.format.DateFormat“;HH";与java.text.simpleDataFormat不同,无法识别,java,android,date-format,simpledateformat,Java,Android,Date Format,Simpledateformat,当我在android.text.format.DateFormat中使用“HH”标志时,它被解释为文字“HH”。但是当我使用java.text.simpleDataFormat时,它被解释为2位数的小时。为什么它们不同 我不是在寻找一个可行的替代方案(我已经知道我必须使用kk而不是HH)。我只是好奇为什么“HH”不被认出来 Java示例: @Override protected void onCreate(Bundle savedInstanceState) { super.onCrea
android.text.format.DateFormat
中使用“HH”标志时,它被解释为文字“HH”。但是当我使用java.text.simpleDataFormat
时,它被解释为2位数的小时。为什么它们不同
我不是在寻找一个可行的替代方案(我已经知道我必须使用kk
而不是HH
)。我只是好奇为什么“HH”不被认出来
Java示例:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Calendar calendar = Calendar.getInstance();
String dateJava = new java.text.SimpleDateFormat(
"dd-MM-yyyy HH:mm:ss").format(calendar.getTime());
String dateAndroid = android.text.format.DateFormat.format(
"dd-MM-yyyy HH:mm:ss", calendar).toString();
TextView tvAndroid = (TextView) findViewById(R.id.tvAndroid);
TextView tvJava = (TextView) findViewById(R.id.tvJava);
tvAndroid.setText("Android: " + dateAndroid); //prints 26-05-2013 HH:36:34
tvJava.setText("Java: " + dateJava); //prints 26-05-2013 22:36:34
}
输出为:
Android: 26-05-2013 HH:36:34
Java: 26-05-2013 22:36:34
我预计两者都是26-05-2013 22:36:34
Android的DateFormat有缺陷吗
Java的SimpleDataFormat接受以下内容:
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
因此,Android开发人员似乎决定更改k
的含义,在他们的DateFormat函数中,它相当于SimpleDateFormatH
,正如他们在自己的
原因是什么?我从未为Android编程过。我在谷歌上搜索了一下,看到了以下例子:
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"
“小时”用小写字母
h
标记,与使用大写字母的SimpleDateFormat
相对 对于android.text.format.DateFormat,您将一天中的小时指定为kk
如下:
String dateAndroid = android.text.format.DateFormat.format(
"dd-MM-yyyy kk:mm:ss", calendar).toString();
对于java.text.simpleDataFormat,您将一天中的小时指定为HH
每天小时数(0-23)
android.text.format.DateFormat的文档:
公共静态最终字符小时
此指示器以24小时格式表示一天中的小时。下午3点的示例:k->15午夜的示例:k->0 kk->00
因为。。。它不是同一件事,它的行为和文档中的状态一样 从 此类仅支持完整Unicode规范的一个子集。如果需要更多,请使用SimpleDataFormat 但如果你: 公共静态最终字符小时 此指示器以24小时格式表示一天中的小时。下午3点的示例:k->15午夜的示例:k->0 kk->00
所以。。。使用该类课程,它将是
kk
而不是HH
我知道您已经接受了答案,但只是为了向您充分解释一下
从
此类中的format
方法实现了Unicode的一个子集
模式。
此类当前支持的子集包括以下格式字符:
acdehlkklmmyz
API级别17之前,仅支持adEhkMmszy
。
请注意,该类错误地实现了k
,就好像它是向后的H
兼容性。
请注意我用粗体标记的部分
我链接到的源代码已经更新,允许使用H,但它还没有正式发布(API 17是Android的最新版本,不支持H)
在源代码的后面,在声明格式字符常量的阶段,有以下注释
/**
* @deprecated Use a literal {@code 'H'} (for compatibility with {@link SimpleDateFormat}
* and Unicode) or {@code 'k'} (for compatibility with Android releases up to and including
* Jelly Bean MR-1) instead. Note that the two are incompatible.
*/
@Deprecated
public static final char HOUR_OF_DAY = 'k';
…然后在角色替换过程中
case 'H': // hour in day (0-23)
case 'k': // hour in day (1-24) [but see note below]
{
int hour = inDate.get(Calendar.HOUR_OF_DAY);
// Historically on Android 'k' was interpreted as 'H', which wasn't
// implemented, so pretty much all callers that want to format 24-hour
// times are abusing 'k'. http://b/8359981.
if (false && c == 'k' && hour == 0) {
hour = 24;
}
replacement = zeroPad(hour, count);
}
break;
这适用于所有Android 4.0+和双日期时间格式 使用java.text.simpleDataFormat 工作示例: 24小时格式使用此日期模式=“dd-MM-yyy-HH:MM” 12小时格式使用此日期模式=“dd MM yyyy hh:MM a”
在java.text.SimpleDateFormat中,如果您想将“7 am”显示为“07”,则可以接受HH。问题是为什么HH不在android中工作。text.format.DateFormat:@msh,他对android的DateFormat有问题,该DateFormat支持
h
@AlexR,相当于SimpleDateFormat
中的HH
(一天中的小时00-23)在DateFormat
中是kk
-h
在这两种格式中都是1-12。正如@Brian Roach所说,h
不是与SimpleDateFormat的h
相反使用的,而是k
。因此,相当于HH
的是kk
。顺便说一句,谢谢你的帮助!我知道kk是另一种选择(我不想找),但根据他们的例子,h在Android的DateFormat中也被接受,那么为什么接受h而不是HH呢?@AlejandroColoradoh
和h
是两件完全不同的事情。无论出于何种原因,Android的DateFormat
决定在00-23小时使用k
而不是H
。为什么?不知道。。。你得追查到底是谁写的然后掐死他们。。。我的意思是问他们没有必要扼杀他们;o) 为什么要更改k
的含义,将其与SimpleDataFormat进行比较?正如我在上次更新中所说,他们决定更改k
的含义,使其与SimpleDataFormatH
等效,尽管他们在文档页面中明确表示:用于格式字符串的规范文档,请参阅SimpleDataFormat。
请参阅我的答案-我不知道为什么在Android中使用“k”,但未来版本将支持“H”是有道理的。在我发布的最后一段代码中的评论表明,使用“kk”可能已经(或者到API 17时仍然)是一个问题。我在SO and that-2中的第一个问题让我有点害怕。我不认为这是一个愚蠢的问题,值得一个-2,但它是好的。我接受批评。@Squonk谢谢你的回答!没问题,很乐意帮忙。我不使用DateFormat
,并且一直使用SimpleDateFormat
,因此需要对源代码进行一些挖掘才能找到答案。顺便说一句,我对你的问题投了更高的票,因为这是一个很好的练习,看看安卓的源代码来了解情况总是很好的——我学到了一些东西。:)这其实是一个很好的问题,不知道为什么人们会投反对票,我投了反对票。格式“k”令人困惑,它不同于SimpleDateFormat和所有日期格式工具的前身-strftimeSorry,@Brian Roach,因为在使用此格式之前,我已将您的答案标记为正确,但这正是我所寻找的!很高兴看到他们将“修复”这个令人困惑的问题
case 'H': // hour in day (0-23)
case 'k': // hour in day (1-24) [but see note below]
{
int hour = inDate.get(Calendar.HOUR_OF_DAY);
// Historically on Android 'k' was interpreted as 'H', which wasn't
// implemented, so pretty much all callers that want to format 24-hour
// times are abusing 'k'. http://b/8359981.
if (false && c == 'k' && hour == 0) {
hour = 24;
}
replacement = zeroPad(hour, count);
}
break;
public static String getDateAsString(Date date, String pattern) {
Locale locale = new Locale("EN");
SimpleDateFormat sdf = null;
try {
sdf = new SimpleDateFormat(pattern, locale);
return sdf.format(date);
} catch (IllegalArgumentException ex) {
// default format
sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm", locale);
return sdf.format(date);
}
}