Joda DateTimeFormat带有正确的数字后缀

3

我需要以类似于星期三,一月9日的形式打印出一个DateTime对象,其中日期自动获取正确的后缀,例如1月2日将变为一月2日。如何获得这样的DateTimeFormatter对象?


1
据我所知,除非进行自定义开发,否则无法实现,也许您应该提出一个功能请求? - fge
据我所知,这是不可能的。但我相信prettytime可以做到。 - Khoa Nghiem
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实例。

好的回答。不过我打算自己实现这个逻辑,因为我只需要格式化月份的日期。 - LuxuryMode
1
是的,或许我应该补充一下,如果您不需要其他 ICU 功能,那么最好编写几行代码来自己完成这个任务,而不是添加 9MB 的 ICU 库 :) - jarnbjo

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

这对于第10、11、12、13、20和30个不起作用。 - jarnbjo
如果您只是想要一个简单的Java方法来添加后缀,而不需要上面提到的缺失链接,那么这个解决方案可能正是您所需要的。 - Grant

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接