3
private String setDate(int day) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date());
    cal.add(Calendar.DATE, + day);
    DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
    String formattedDate = df.format(cal.getTime());
    return formattedDate;
}

上述方法返回“14/06/12”Locale.UK和“06/14/12” Locale.US

我怎样才能让它完整地返回一年,即美国地区的“14/06/2012”和英国地区的“06/14/2012”?

4

3 回答 3

8

JHS 的回答几乎是完整的。唯一需要做的就是让它适用于所有语言环境。

import java.text.SimpleDateFormat;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Locale;

class ChangeDateFormat
{
    private String setDate(int day, Locale locale) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, +day);
        DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
        if (df instanceof SimpleDateFormat)
        {
            SimpleDateFormat sdf = (SimpleDateFormat) df;
            // To show Locale specific short date expression with full year
            String pattern = sdf.toPattern().replaceAll("y+","yyyy");
            sdf.applyPattern(pattern); 
            return sdf.format(cal.getTime());
        }
        String formattedDate = df.format(cal.getTime());
        return formattedDate;
    }

    public static void main(String[] args)
    {
        ChangeDateFormat cdf = new ChangeDateFormat();        
        System.out.println(cdf.setDate(1, Locale.JAPAN));
    }
}

根据Greg 的评论(感谢 Greg),以下是 javadoc 中的相关说明:

“如果你想对格式或解析有更多的控制权,(或者想给你的用户更多的控制权),你可以尝试将DateFormat你从工厂方法中得到的转换为SimpleDateFormat. 这适用于大多数国家;只要记住把它放在一个try街区里,以防你遇到不寻常的东西。”

于 2012-06-14T02:31:07.890 回答
2

您将必须获取locale模式并将额外的附加yy到格式中。

这可以帮助你 -

private String setDate(int day) {
  Calendar cal = Calendar.getInstance();
  cal.setTime(new Date());
  cal.add(Calendar.DATE, + day);    
  DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
  // code modified from here
  SimpleDateFormat sdf = (SimpleDateFormat) df;
  sdf.applyPattern(sdf.toPattern().replace("yy","yyyy")); // replacing to yyyy
  String formattedDate = sdf.format(cal.getTime());
  return formattedDate;
}

这适用于最终返回 2 位数年份的所有模式。

我有sdf.toPattern.concat("yy")它只对那些最终Locale拥有yy的人有用。不过Dragon66的使用想法replace("yy", "yyyy")对所有人都适用Locale

于 2012-06-13T23:40:40.280 回答
0

您必须希望您DateFormat是 的一个实例SimpleDateFormat,以便您可以获取它的模式并将其从 2 年更改为 4 年。

于 2012-06-13T23:19:44.753 回答