【问题标题】:How to format date to string like "31st Dec, 2000" in Java [duplicate]如何在Java中将日期格式化为“2000年12月31日”之类的字符串[重复]
【发布时间】:2012-09-03 06:42:54
【问题描述】:

我尝试使用 SimpleDateFormat 类来执行此操作,但我没有找到任何在一天之后放置 'st' 的选项。我只能得到 '31 Dec, 2000'

如何格式化 "31st Dec, 2000" 。我有以毫秒为单位的日期。

Java 中是否有任何 API 可以让我们以这种方式格式化日期?

【问题讨论】:

  • 几个月前我也想这样做,结果我自己实现了它。在date%10 上带有switch 的东西是1、2 或3 并且<10>20
  • 我假设您也想添加“nd”和“rd”?
  • 编写自己的格式化程序
  • @JacoVanNiekerk 是的.. 我没有得到该格式的单词(名称)..

标签: java date format simpledateformat


【解决方案1】:

一个带开关盒的简单功能,这样做

Public String getDateSuffix( int day) { 
        switch (day) {
            case 1: case 21: case 31:
                   return ("st");

            case 2: case 22: 
                   return ("nd");

            case 3: case 23:
                   return ("rd");

            default:
                   return ("th");
        }
}

【讨论】:

    【解决方案2】:

    下面的小函数会返回一个String 后缀。 (盗自this answer)。

    String getDayOfMonthSuffix(final int n) {
        if (n < 1 || n > 31) {
            throw new IllegalArgumentException("Illegal day of month");
        }
    
        if (n >= 11 && n <= 13) {
            return "th";
        }
    
        switch (n % 10) {
            case 1:  return "st";
            case 2:  return "nd";
            case 3:  return "rd";
            default: return "th";
        }
    }
    

    然后,您需要做的就是:

    SimpleDateFormat dd = new SimpleDateFormat("dd");
    SimpleDateFormat mmyyyy = new SimpleDateFormat("MMM, yyyy");
    
    String formattedDate = dd.format(date) + getDayOfMonthSuffix(date.get(Calendar.DAY_OF_MONTH)) + " " + mmyyyy.format(date);
    

    【讨论】:

    • 是的,上面的代码可以正常工作......但是,与单行相比,它是如此庞大,但我认为你不能真正做到更短。
    【解决方案3】:

    我在评论中回复了,但我想我可以放弃代码。

    /**
     * Returns the appropriate suffix from th, nd or rd
     * @param cal
     * @return
     */
    public static String dateSuffix(final Calendar cal) {
        final int date = cal.get(Calendar.DATE);
        switch (date % 10) {
        case 1:
            if (date != 11) {
                return "st";
            }
            break;
    
        case 2:
            if (date != 12) {
                return "nd";
            }
            break;
    
        case 3:
            if (date != 13) {
                return "rd";
            }
            break;
        }
        return "th";
    }
    

    用法:

    SimpleDateFormat sdf = new SimpleDateFormat("d'%s' MMM, yyyy");
    String myDate = String.format(sdf.format(date), Util.dateSuffix(date));
    

    【讨论】:

    • 如果我已经有一个以毫秒为单位的日期会怎样..
    • 我不知道你的日期是从哪里来的,但是当我需要处理日期时,我发现处理 Java Calendar 会容易得多。你可能想做:Calendar cal = new GregorianCalendar(); cal.setTimeInMillis(yourTimeInMillis);
    【解决方案4】:

    这可能有点短:

    String getDayOfMonthSuffix(final int n) {
        if (n < 1 || n > 31) {
            throw new IllegalArgumentException("Illegal day of month");
        }
        final String[] SUFFIX = new String[] { "th", "st", "nd", "rd" };
        return (n >= 11 && n <= 13) || (n % 10 > 3) ? SUFFIX[0] : SUFFIX[n % 10];
    }
    

    【讨论】:

    • 如果你的 n 是 4 会怎样?你会得到 ArrayIndexOutOfBoundsException
    • 非常正确...当您不测试代码时会发生这种情况...现在是正确的...我希望:)
    【解决方案5】:

    您可以使用值数组。

    private static final String[] TH_SUFFIX = ",st,nd,rd,th,th,th,th,th,th,th,th,th,th,th,th,th,th,th,th,th,st,nd,rd,th,th,th,th,th,th,th,st".split(",");
    
    public static String getDayOfMonthSuffix(int n) {
        return TH_SUFFIX[n];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多