添加日期格式并提供上午/下午以时间格式

时间:2019-03-12 09:25:25

标签: java

日期API中是否有任何特定格式,可以在特定日期之后打印st,nd,rd和th。假设12月26日应为12月26日。

时间上的任何特定格式(例如上午10.30)也应完全相同。

只需内置模式即可解决此问题。

我为场景编写了以下代码,但未获得任何期望的输出

    //Checking date format
    String pattern = "EEE, MMM.dd";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
    String date = simpleDateFormat.format(new Date());
    System.out.println(date);

    //checking time format

    DateFormat dateFormat2 = new SimpleDateFormat("hh.mm aa.");
    String dateString2 = dateFormat2.format(new Date()).toString();
    System.out.println(dateString2);

3 个答案:

答案 0 :(得分:2)

否,没有这样的格式。如您所见in the documentationSimpleDateFormat的日期和时间模式没有提供26th之类的东西。

答案 1 :(得分:1)

第一个问题的解决方案:

SimpleDateFormat format = new SimpleDateFormat("d");
String date = format.format(new Date());

if(date.endsWith("1") && !date.endsWith("11"))
    format = new SimpleDateFormat("EE MMM d'st', yyyy");
else if(date.endsWith("2") && !date.endsWith("12"))
    format = new SimpleDateFormat("EE MMM d'nd', yyyy");
else if(date.endsWith("3") && !date.endsWith("13"))
    format = new SimpleDateFormat("EE MMM d'rd', yyyy");
else 
    format = new SimpleDateFormat("EE MMM d'th', yyyy");

String yourDate = format.format(new Date());

第二个问题的解决方案:

public static String getTimeFromHours(long time) {
    int min = (int) (time / 60);
    int hours = min / 60;
    int remaining_min = min % 60;

    if (hours > 12) {
        return String.format(Locale.ENGLISH, "%02d:%02d %s", hours - 12, remaining_min, "PM");
    } else if (hours < 12) {
        return String.format(Locale.ENGLISH, "%02d:%02d %s", hours, remaining_min, "AM");
    } else {
        return String.format(Locale.ENGLISH, "%02d:%02d %s", hours, remaining_min, "PM");
    }
}

尝试一下,它应该适合您。

答案 2 :(得分:0)

我建议使用java.time。您可以通过将自定义映射传递到DateTimeFormatterBuilder()方法来使用appendText()构建自定义格式器。

LocalTime的上午/下午示例:

    LocalTime localTime = LocalTime.now();        

    Map<Long, String> map = new HashMap<>();
    map.put(0L, "a.m");
    map.put(1L, "p.m");

    DateTimeFormatter aMpM_formatter = new DateTimeFormatterBuilder()
        .appendPattern("hh:mm:ss ")
        .appendText(ChronoField.AMPM_OF_DAY, map)   // without your custom map 0 is mapped to AM and 1 is mapped to PM
        .toFormatter();

    System.out.println(localTime.format(aMpM_formatter));

带有后缀的LocalDate的示例:

    LocalDate localDate = LocalDate.now();
    Map<Long, String> daysWithSuffix = new HashMap<>(); // map values
    daysWithSuffix.put(1L,  "1st");
    daysWithSuffix.put(2L,  "2nd");
    daysWithSuffix.put(3L,  "3rd");
    daysWithSuffix.put(21L, "21st");
    daysWithSuffix.put(22L, "22nd");
    daysWithSuffix.put(23L, "23rd");
    daysWithSuffix.put(31L, "31st");
    for (long d = 1; d <= 31; d++) {
        daysWithSuffix.putIfAbsent(d, d + "th");
    }

    DateTimeFormatter thFormatter = new DateTimeFormatterBuilder()
            .appendPattern("EEE, MMM ") 
            .appendText(ChronoField.DAY_OF_MONTH, daysWithSuffix)   // mapped values from your custom map              
            .toFormatter();

    System.out.println(localDate.format(thFormatter));
    System.out.println(LocalDate.of(2019, Month.MARCH, 1).format(thFormatter));
    System.out.println(LocalDate.of(2019, Month.MARCH, 23).format(thFormatter));

LocalDateTime的示例,其日期后缀为序数并自定义上午/下午:

    DateTimeFormatter both  = new DateTimeFormatterBuilder()
            .appendPattern("EEE, MMM ") 
            .appendText(ChronoField.DAY_OF_MONTH, daysWithSuffix)
            .appendLiteral(" ")
            .appendPattern("hh:mm:ss ")
            .appendText(ChronoField.AMPM_OF_DAY, map)
            .toFormatter();

    System.out.println(LocalDateTime.now().format(both));