3

我需要以DateTime例如 的形式打印 a Wednesday, January 9th,其中月份中的日期会自动获得正确的后缀,例如 1 月 2 日将是January 2nd。我怎样才能得到一个DateTimeFormatter这样做的?

4

3 回答 3

4

Joda 不支持此功能,但有一些限制,您可以使用ICU 库,因为它包含用于格式化序数的本地化规则:

import com.ibm.icu.text.RuleBasedNumberFormat;
import com.ibm.icu.text.SimpleDateFormat;

...

SimpleDateFormat sdf = 
    new SimpleDateFormat("EEEE, MMMM d", Locale.ENGLISH);

sdf.setNumberFormat(
    new RuleBasedNumberFormat(
        Locale.ENGLISH, RuleBasedNumberFormat.ORDINAL));

System.out.println(sdf.format(new Date()));

请注意,您只能为 SimpleDateFormat 实例指定一个 NumberFormat 实例,因此这种方法仅在“日期”是日期模式中唯一的数字时才有效。将“yyyy”添加到日期模式将例如将年份格式化为“2,013th”。

ICU 类与标准 API 中的 Date 和 Calendar 类接口,因此如果您确实必须首先使用 Joda,则必须从 Joda DateTime 实例创建 java.util.Date。

于 2013-01-09T16:05:04.617 回答
1

在 Joda 中,为了简单地获得月份日期的正确后缀,如下简单的事情就足够了:

        String dayOfMonth = now.dayOfMonth().getAsText();

        String suffix = "";
        if(dayOfMonth.endsWith("1")) suffix = "st";
        if(dayOfMonth.endsWith("2")) suffix = "nd";
        if(dayOfMonth.endsWith("3")) suffix= "rd";
        if(dayOfMonth.endsWith("0") || dayOfMonth.endsWith("4") || dayOfMonth.endsWith("5") || dayOfMonth.endsWith("6")
                || dayOfMonth.endsWith("7") || dayOfMonth.endsWith("8") || dayOfMonth.endsWith("9")) suffix = "th";
于 2013-01-09T16:29:42.387 回答
0

我不喜欢使用另一个库的解决方案,所以我使用正则表达式来预处理字符串并删除序数后缀来解决这个问题

val dateString1 = "6th December 2016"
dateString1.replaceFirst("^(\\d+).*? (\\w+ \\d+)", "$1 $2")
val dtf = DateTimeFormat.forPattern("dd MMMM yyyy").withLocale(Locale.ENGLISH)
val d1 = dtf.parseLocalDate(cured)

现在 d1 应该是d1: org.joda.time.LocalDate = 2016-12-06

于 2017-05-02T14:08:44.633 回答