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


70

格式化日期时间后,时间以大写形式显示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);  
    }
}

1
st.toLowerCase()会做到的,没有比这更简单的方法了。
Marko Topolnik 2012年

2
麻烦的是,像月和日的名称一样,AM / PM标记是特定于语言环境的-在某些语言中将所有内容都强制小写可能没有意义(撇开某些语言仅对所有内容使用24小时制这一事实并且根本没有关于AM和PM的条款)。
伊恩·罗伯茨

Answers:


78

不幸的是,标准格式设置方法不允许您这样做。乔达也没有。我认为您将必须通过简单的后格式替换来处理格式日期。

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

您可以使用replaceAll()使用regepxs的方法,但是我认为以上方法就足够了。我没有做任何解释,toLowerCase()因为如果将来更改格式字符串以包含(例如)月份名称或类似名称,可能会破坏格式。

编辑:James Jithin的解决方案看起来好得多,而且执行此操作的正确方法(如评论中所述)


所有答案都是正确的或接近正确的。但是,答案很简单,符合我的标准
xrcwrn 2012年

4
发布者的答案James Jithin是实现此目的的完美方法。
Mehul Joisar 2014年

我更喜欢Brian Agnew的解决方案。这是敏捷方法。可能工作的最少代码量。
丹·托里

1
一种变化timeStr = timeStr.toLowerCase(Locale.UK);
Gene Bo

这个答案不够好,因为有些电话显示AM / PM,另一些电话显示AM / PM,James Jithin的响应可以解决这个问题,因此效果更好。
哈达斯·卡明斯基

90

这有效

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

1
@BrianAgnew,不确定,您可以尝试更新从joda-time.sourceforge.net/api-release/org/joda/time/…
James Jithin 2012年

1
在中指定LocaleSimpleDateFormate,使用会DateFormatSymbols使其混乱。您可能必须专门设置所有符号,而不仅仅是am / pm。
Suragch 2014年

1
这很棒!谢谢哥们。:)
Kartheek '16

1
感谢伟大的工作,在我的情况需要更换提供" """,例如毫米:HHMMA:HH
项塔兰TUPE

7

尝试这个:

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

尽管您可以按照此处详细说明创建自定义格式,此处的

不幸的是出的盒子AM和PM似乎并不在标准的SimpleDateFormat类定制


1
这会使ntire字符串变为小写,我猜OP仅需要小写am / pm,否则,这是一个很好的解决方案:)
PermGenError 2012年

是的,我尝试过,您是正确的@Brian Agnew的答案非常正确
xrcwrn 2012年

6

如果您不想执行字符串替换,并且正在使用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);

简单到核心。确定射击程序。
Mourya

2

如果您想要默认am,pm以外的其他样式,James的答案很好。但是,恐怕您需要在Locale和特定于Locale的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中找到更多详细信息。


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

//输出=> 06/18/2019 am(PST)

Locale.UK => am或pm; Locale.US => AM或PM; 根据您的需要尝试不同的语言环境(默认等)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.