Подтвердить что ты не робот

Отображение AM и PM в нижнем регистре после форматирования даты

После форматирования даты и времени время отображается как AM или PM в верхнем регистре, но я хочу, чтобы оно было в нижнем регистре, например, am или pm.

Это мой код:

public class Timeis {
    public static void main(String s[]) {
        long ts = 1022895271767L;
        String st = null;  
        st = new SimpleDateFormat(" MMM d 'at' hh:mm a").format(ts);
        System.out.println("time is " + ts);  
    }
}
4b9b3361

Ответ 1

К сожалению, стандартные методы форматирования не позволяют вам сделать это. И Йода тоже. Я думаю, что вам придется обрабатывать отформатированную дату простой заменой в постформатном формате.

String str = oldstr.replace("AM", "am").replace("PM","pm");

Вы могли бы использовать метод replaceAll() который использует регулярные выражения, но я думаю, что вышеупомянутого, возможно, достаточно. Я не делаю toLowerCase() так как это может toLowerCase() форматирование, если вы в будущем измените форматную строку, чтобы содержать (скажем) названия месяцев или аналогичные.

РЕДАКТИРОВАТЬ: решение Джеймса Джитина выглядит намного лучше, и правильный способ сделать это (как отмечено в комментариях)

Ответ 2

Это работает

public class Timeis {
    public static void main(String s[]) {
        long ts = 1022895271767L;
        SimpleDateFormat sdf = new SimpleDateFormat(" MMM d 'at' hh:mm a");
        // CREATE DateFormatSymbols WITH ALL SYMBOLS FROM (DEFAULT) Locale
        DateFormatSymbols symbols = new DateFormatSymbols(Locale.getDefault());
        // OVERRIDE SOME symbols WHILE RETAINING OTHERS
        symbols.setAmPmStrings(new String[] { "am", "pm" });
        sdf.setDateFormatSymbols(symbols);
        String st = sdf.format(ts);
        System.out.println("time is " + st);
    }
}

Ответ 3

Попробуйте следующее:

System.out.println("time is " + ts.toLowerCase());

Хотя вы можете создать собственный формат здесь и здесь

К сожалению, из box AM и PM, похоже, не настраиваются в стандартном классе SimpleDateFormat

Ответ 4

Если вы не хотите делать подстановку строк, и используете Java 8 javax.time:

Map<Long, String> ampm = new HashMap<>();
ampm.put(0l, "am");
ampm.put(1l, "pm");

DateTimeFormatter dtf = new DateTimeFormatterBuilder()
        .appendPattern("E M/d h:mm")
        .appendText(ChronoField.AMPM_OF_DAY, ampm)
        .toFormatter()
        .withZone(ZoneId.of("America/Los_Angeles"));

Необходимо вручную построить DateTimeFormatter (указав отдельные части), так как для строчных букв am/pm нет символа шаблона. Вы можете использовать appendPattern до и после.

Я полагаю, что нет никакого способа заменить символы по умолчанию am/pm, так как это единственный способ сделать замену строки в последней строке.

Ответ 5

Calendar c = Calendar.getInstance();

System.out.println("Current time => " + c.getTime());

SimpleDateFormat df = new SimpleDateFormat("HH:mm a");
String formattedDate = df.format(c.getTime());
formattedDate = formattedDate.replace("a.m.", "AM").replace("p.m.","PM");

TextView textView = findViewById(R.id.textView);
textView.setText(formattedDate);

Ответ 6

Ответ Джеймса велик, если вы хотите другой стиль, отличный от по умолчанию am, pm. Но я боюсь, что вам нужно сопоставить локальные и локальные специфические AM/PM, установленные для принятия переопределения. Теперь вы просто используете java встроенный класс java.util.Formatter. Поэтому простой пример выглядит так:

System.out.println(String.format(Locale.UK, "%1$tl%1$tp", LocalTime.now()));

Он дает:

9pm

Чтобы отметить, что если вы хотите использовать верхний регистр, просто замените "% 1 $ t p" на "% 1 $ T p". Вы можете найти более подробную информацию на http://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#dt.

Ответ 7

просто добавьте toLowarCase(), как этот

public class Timeis {
public static void main(String s[]) {
      long ts = 1022895271767L;
      String st = null;  
      st = new SimpleDateFormat(" MMM d 'at' hh:mm a").format(ts).toLowerCase();
      System.out.println("time is " + ts);  
}
}

и toUpperCase(), если вы хотите использовать верхний регистр

Ответ 8

    String today = now.format(new DateTimeFormatterBuilder()
            .appendPattern("MM/dd/yyyy ")
            .appendText(ChronoField.AMPM_OF_DAY)
            .appendLiteral(" (PST)")
            .toFormatter(Locale.UK));

//output => 18/06/2019 (PST)

Locale.UK => утра или вечера; Locale.US => AM или PM; попробуйте другой язык для ваших нужд (по умолчанию и т.д.)