在日期格式化后以小写形式显示AM和PM

问题描述 投票:61回答:8

格式化日期时间后,时间以大写形式显示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);  
    }
}
java datetime simpledateformat
8个回答
64
投票

不幸的是,标准的格式化方法不允许你这样做。乔达也不是。我想你将不得不通过一个简单的post-format替换来处理你的格式化日期。

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

您可以使用使用regepxs的replaceAll()方法,但我认为上面的内容可能就足够了。我不是在做一个毯子toLowerCase(),因为如果你将来改变格式字符串以包含(比方说)月份名称或类似名称,那可能会搞砸格式化。

编辑:James Jithin's solution看起来好多了,并采取正确的方法(如评论中所述)


80
投票

这有效

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

6
投票

试试这个:

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

虽然您可以创建详细的herehere自定义格式

不幸的是,在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符号,这使得这是在最终字符串上执行字符串替换的唯一方法。


3
投票
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);

1
投票

詹姆斯的答案很棒,如果你想要不同于默认的上午,下午的风格。但我担心您需要在Locale和Locale特定的AM / PM集之间进行映射以采用覆盖。现在您只需使用java内置的java.util.Formatter类。所以一个简单的例子看起来像这样:

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找到更多详情。


0
投票

只需像这样添加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()如果你想要大写


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

// output => 06/18/2019 am(太平洋标准时间)

Locale.UK => am或pm; Locale.US => AM或PM;根据您的需求尝试不同的区域设置(默认等)

© www.soinside.com 2019 - 2024. All rights reserved.