android.text.format.DateFormat"HH"与java.text.SimpleDateFormat无法识别

Ale*_*ado 18 java android date-format simpledateformat

当我使用"HH"标志时android.text.format.DateFormat,它被解释为文字"HH".但是当我使用java.text.SimpleDateFormat它时,它被解释为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
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Android: 26-05-2013 HH:36:34 
Java:    26-05-2013 22:36:34
Run Code Online (Sandbox Code Playgroud)

我希望两者都是 26-05-2013 22:36:34

Android的DateFormat有错误吗?

Java的SimpleDateFormat接受这些:

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
Run Code Online (Sandbox Code Playgroud)

所以看来Android开发人员决定改变其k在DateFormat函数中的含义,它等同于SimpleDateFormat,H正如他们在文档页面中明确指出的那样:

This constant was deprecated in API level 18. Use a literal 'H' (for 
compatibility with SimpleDateFormat and Unicode) or 'k' (for compatibility 
with Android releases up to and including Jelly Bean MR-1) instead. Note 
that the two are incompatible. 
Run Code Online (Sandbox Code Playgroud)

这是什么原因?

Squ*_*onk 9

我知道你已经接受了答案,但只是向你解释一下......

DateFormat.java源代码 ...

format此类中的方法实现Unicode UTS#35模式的子集 .此类当前支持的子集包括以下格式字符: acdEHhLKkLMmsyz.最高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';
Run Code Online (Sandbox Code Playgroud)

......以及后来的角色更换......

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;
Run Code Online (Sandbox Code Playgroud)


Bri*_*ach 5

因为......它不是同一个东西,而且它的行为就像文档所说的那样?

来自android.text.format.DateFormat文档

此类仅支持完整Unicode规范的子集.如果您需要更多,请使用SimpleDateFormat.

但是如果你进一步阅读文档:

public static final char HOUR_OF_DAY

该指示符以24小时格式指示一天中的小时.下午3点的例子:k - > 15午夜的例子:k - > 0 kk - > 00

所以...使用那个类,它kk代替的是HH