具有正确数字后缀的Joda DateTimeFormat

时间:2013-01-09 15:07:57

标签: java jodatime

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

3 个答案:

答案 0 :(得分:4)

在Joda中没有对此的支持,但由于存在一些限制,您可以使用ICU library,因为它包含格式化序号的本地化规则:

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实例,因此仅当“day of month”是日期模式中的唯一数字时,此方法才有效。将“yyyy”添加到日期模式中将例如将年份格式化为“第2,013”。

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

答案 1 :(得分: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";

答案 2 :(得分: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