Преобразование строки во время с использованием проблем SimpleDateFormat - PullRequest
0 голосов
/ 21 мая 2018

Итак, я использую SimpleDateFormat для преобразования строки, которая имеет формат «ЧЧ: ММ AA», в «ЧЧ: ММ». Проблема в том, что мой код отлично работает при затмении, но когда я запускаю его в Android Studio, он показывает неправильный вывод,Вот мои оба кода.

Eclipse code

Android Studio code

Ответы [ 4 ]

0 голосов
/ 21 мая 2018

java.time

    String newTimeString = LocalTime
            .parse("2:30 PM", DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH))
            .toString();
    System.out.println(newTimeString);

Это печатает

14: 30

Даже на Android вы не должны бороться с возрастом.старый и общеизвестно хлопотный SimpleDateFormat класс.java.time, современный Java-интерфейс даты и времени, гораздо приятнее работать.LocalTime - это время суток без даты и без часового пояса, поэтому, похоже, оно очень точно соответствует вашим требованиям.

Вопрос: Можно ли использовать java.time на Android?

Да,java.time прекрасно работает на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26, как мне сказали), современный API поставляется встроенным.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. ссылки внизу).
  • На (более старом) использовании AndroidAndroid-версия ThreeTen Backport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Что пошло не так в вашем коде?

  • На первом снимке экрана вы форматируетеиспользуя строку шаблона формата HH:mm.Прописные буквы HH для часа дня и строчные буквы mm для минуты часа.Таким образом, вы получите ожидаемое значение 14:30.
  • . На втором снимке экрана вы использовали HH:MM, то есть прописные буквы MM.Это на месяц.Поскольку у проанализированной строки не было месяца, по умолчанию она была равна январю, который, в свою очередь, отображался как 01 в вашем результате, поэтому вы получили 14:01.Для SimpleDateFormat очень типично, что он соглашается напечатать месяц, которого никогда не было, просто делает вид, что все в порядке, не сообщает вам об ошибке.Это лишь одна из многих причин, по которым я рекомендую вам избегать этого класса.

Ссылки

0 голосов
/ 21 мая 2018

Проблема в том, что вы используете «ММ» в качестве минут, но оно должно быть «мм»."ММ" - для месяцев.

Часть "ЧЧ" в порядке, если вы хотите вернуть значения за 24 часа.

попробуйте что-то вроде этого:

public static String getTimeFormatted(String time){
    String s = "";
    try{
        SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa", Locale.US);
        Date d = sdf.parse(time);


        SimpleDateFormat formatter = new SimpleDateFormat("HH:mm", Locale.US);
        s = formatter.format(d);
    }
    catch(Exception ex){
        s = ex.getMessage();
    }
    return s;
}
0 голосов
/ 21 мая 2018

попробуйте

  public String changeDateFormatFromAnother(String date){
        @SuppressLint("SimpleDateFormat") DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        @SuppressLint("SimpleDateFormat") DateFormat outputFormat = new SimpleDateFormat("dd MMMM yyyy");
        String resultDate = "";
        try {
            resultDate=outputFormat.format(inputFormat.parse(date));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return resultDate;
    }
0 голосов
/ 21 мая 2018

Попробуйте этот код ..

 String date="2:30 PM";
    SimpleDateFormat sdf5 = new SimpleDateFormat("hh:mm aa");
    SimpleDateFormat sdf6 = new SimpleDateFormat("HH:mm");
    try {
        String str=sdf6.format(sdf5.parse(date));
        Log.d("DATE TO:",str);
    } catch (ParseException e) {
        e.printStackTrace();
    }
...