андроид.текст.формат.DateFormat " HH " не распознается, как с java.текст.Класса 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
}
вывод:
Android: 26-05-2013 HH:36:34
Java: 26-05-2013 22:36:34
Я ожидаю, что оба должны быть 26-05-2013 22:36:34
тут У DateFormat Android есть ошибка?
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
таким образом, похоже, разработчики 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.
в чем причина этого?
5 ответов
Я понимаю, что вы уже приняли ответ, но просто чтобы полностью объяснить это вам...
С исходный код для DateFormat.java...
методы {@code format} в этом классе реализуют подмножество Unicode UTS #35 шаблоны. Подмножество, в настоящее время поддерживаемое этим классом, включает следующие символы формата: {@code acdEHhLKkLMmsyz}. до уровня API 17 поддерживались только {@code adEhkMmszy}. Обратите внимание, что этот класс неправильно реализует {@code k} как если бы он был {@code 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.текст.формат.Параметра dateformat
этот класс поддерживает только подмножество полной спецификации Unicode. Используйте SimpleDateFormat, если вам нужно больше.
а если вы Читать далее документы:
public static final char HOUR_OF_DAY
этот обозначение указывает час дня в 24-часовом формате. Пример для 3pm: k - > 15 примеров для полуночи: k - > 0 kk - > 00
Так ... используя этот класс, это будет kk
вместо HH
для android.текст.формат.DateFormat вы назначаете час в день как kk
такой:
String dateAndroid = android.text.format.DateFormat.format(
"dd-MM-yyyy kk:mm:ss", calendar).toString();
для java.текст.SimpleDateFormat вы назначаете час в день как HH
.
час в день (0-23)
документация для android.текст.формат.DateFormat:
public static final char HOUR_OF_DAY
этот указатель указывает час дня в 24-часовом формате. Пример для 3pm: k - > 15 Примеры для midnight: k - > 0 kk - > 00
Я никогда не программировал для Android. Я погуглил DateFormat javadoc и увидел там следующие примеры:
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 4.0+ и для двух форматов даты времени.
используйте java.текст.Класса simpledateformat.
работа пример:
24-часовой формат используйте этот шаблон даты="ДД-ММ-гггг чч:мм";
12-часовой формат этой даты = "dd-MM-yyyy hh: mm a";
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);
}
}