2013-04-23 56 views
1

我想创建一个Joda 2.2 DateTimeFormatter来重构我的代码。我试图重现行为是编程Joda时间格式化程序

private String getSemesterLabel() { 
    StringBuilder sb = new StringBuilder(date.toString("yyyy")); 
    if (date.getMonthOfYear() < 7) { 
     sb.insert(0, "first semester "); 
    } else { 
     sb.insert(0, "second semester "); 
    } 
    return sb.toString(); 
} 

什么是获得DateTimeFormatter将封装上述行为的最简单的方法?

+0

我看到你的评论和反对票因为我已经阅读了整个文档,但找不到任何相关的东西。我发现的唯一方法是从头开始创建一个完整的DateTimeFormatter,这太值得重构了。 因为我不知道如何做某事(这说明我没有看到任何细节,我可以提供)并不意味着这个问题是不合法的。 – clark 2013-04-23 15:05:31

+0

我想我完全误解了你的问题。你希望找到一个理解学期概念的格式化程序吗? – 2013-04-24 07:31:14

+0

我不知道你的意思是“单身”。我正在尝试创建一个'DateTimeFormatter'对象来封装上述代码中描述的业务行为。我不认为答案就像'DateTimeFormat#forPattern(String)'一样简单。 如果您错误地投了票。我将不胜感激你投票回来。谢谢。 – clark 2013-04-24 08:06:11

回答

2

使用内置模式符号不能打印学期信息(请参阅此similar issue in a bug report)。你有两个选择:

  1. 从头开始构建逻辑

    可以产生使用从DateTimeFormat类的静态方法DateTimeFormatter实例:

    DateTimeFormatter format = DateTimeFormat.forPattern("yyyy"); 
    

    您也可以检索月份从乔达DateTime通过呼吁:

    myDateTime.monthOfYear().get(); 
    


  2. 使用DateTimeFormatterBuilder构建一个格式化

    的替代,可能是使用DateTimeFormatterBuilder构建定制DateTimeFormatter显示您的首选文本。喜欢的东西:

    DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); 
    builder.append(DateTimeFormat.forPattern("yyyy")); 
    builder.appendLiteral(' '); 
    builder.append(new SemesterPrinter()); 
    return builder.toFormatter(); 
    

    其中SemesterPrinter需要实现DateTimePrinter,并会承担一切生产基础上提供的日期信息的文本first semestersecond semester ..

+0

嗯,我看不出这将如何打印“第一学期”或“第二学期”...只打印年份是(非常)容易的部分... – 2013-04-24 07:17:40

+0

@LudovicPénet啊,第二个想到我可能误解了题。我编辑了我的答案。 – 2013-04-24 07:28:25

+0

我担心我确实必须从零开始构造DateTimePrinter ... – clark 2013-04-24 13:04:41