отображение утра и вечера в строчной букве после форматирования даты


после даты форматирования я показываю время, которое показывает 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);  
 }
}
7 55

7 ответов:

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

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

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

изменить: решение Джеймс Jithin выглядит намного лучше, и правильный способ сделать это (как указано в комментариях)

это работает

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);
    }
}

попробуйте это:

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

хотя вы можете быть в состоянии создать пользовательский формат полная здесь и здесь

из box AM и PM не кажутся настраиваемыми в стандартном классе SimpleDateFormat

если вы не хотите делать подстановку строк и используете Java 8javax.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 по умолчанию, что делает это единственным способом, не требующим замены строки в последней строке.

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);

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

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

это дает:

9pm

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

просто добавить 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() Если вы хотите верхний регистр