74

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

9 回答 9

96

这有效

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);
    }
}
于 2012-11-27T10:14:44.927 回答
84

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

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

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

编辑:James Jithin 的解决方案看起来好多了,而且这样做的正确方法(如评论中所述)

于 2012-11-27T10:02:41.217 回答
7

如果您不想进行字符串替换,并且正在使用 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 符号,这使得这是在最终字符串上进行字符串替换的唯一方法。

于 2017-02-26T08:41:13.230 回答
6

尝试这个:

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

尽管您可以创建自定义格式,如此处和此处详述

不幸的是,开箱即用的 AM 和 PM 似乎无法在标准 SimpleDateFormat 类中自定义

于 2012-11-27T10:03:07.177 回答
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);
于 2017-12-30T09:47:58.350 回答
2

如果您想要除默认上午、下午以外的其他风格,詹姆斯的回答非常棒。但恐怕您需要在区域设置和区域设置特定的 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找到更多详细信息。

于 2015-08-06T21:12:33.010 回答
0

这就是我们在 android studio 的 java 代码中执行传递 unix 时间戳作为参数的方式

private String convertTimeToTimeStamp(Long timeStamp){
            SimpleDateFormat sdf=new SimpleDateFormat("hh:mm aaa", Locale.getDefault());
            return sdf.format(timeStamp);
        }

函数返回格式为 09:30 PM 的时间

于 2021-11-24T10:31:13.073 回答
0
    String today = now.format(new DateTimeFormatterBuilder()
            .appendPattern("MM/dd/yyyy ")
            .appendText(ChronoField.AMPM_OF_DAY)
            .appendLiteral(" (PST)")
            .toFormatter(Locale.UK));

// 输出 => 2019 年 6 月 18 日上午(太平洋标准时间)

Locale.UK => 上午或下午;Locale.US => 上午或下午;根据您的需要尝试不同的语言环境(默认等)

于 2019-06-18T13:06:16.053 回答
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()如果你想要大写

于 2017-04-04T12:21:45.287 回答