Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android.text.format.DateFormat“;HH";与java.text.simpleDataFormat不同,无法识别_Java_Android_Date Format_Simpledateformat - Fatal编程技术网

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函数中,它相当于SimpleDateFormat
H
,正如他们在自己的


原因是什么?

我从未为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呢?@AlejandroColorado
h
h
是两件完全不同的事情。无论出于何种原因,Android的
DateFormat
决定在00-23小时使用
k
而不是
H
。为什么?不知道。。。你得追查到底是谁写的然后掐死他们。。。我的意思是问他们没有必要扼杀他们;o) 为什么要更改
k
的含义,将其与SimpleDataFormat进行比较?正如我在上次更新中所说,他们决定更改
k
的含义,使其与SimpleDataFormat
H
等效,尽管他们在文档页面中明确表示:
用于格式字符串的规范文档,请参阅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);
        }
 }