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