SimpleDateFormat模式基于语言环境,但强制使用4位数年份

时间:2011-10-17 15:55:51

标签: java locale simpledateformat

我需要建立一个像dd/MM/yyyy这样的日期格式。它几乎像DateFormat.SHORT,但包含4年的数字。

我尝试用

实现它
new SimpleDateFormat("dd//MM/yyyy", locale).format(date);

但是对于美国语言环境,格式错误。

是否有一种常用的方法来格式化基于区域设置更改模式的日期?

谢谢

4 个答案:

答案 0 :(得分:10)

我会这样做:

    StringBuffer buffer = new StringBuffer();

    Calendar date = Calendar.getInstance();
    DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
    FieldPosition yearPosition = new FieldPosition(DateFormat.YEAR_FIELD);

    StringBuffer format = dateFormat.format(date.getTime(), buffer, yearPosition);
    format.replace(yearPosition.getBeginIndex(), yearPosition.getEndIndex(), String.valueOf(date.get(Calendar.YEAR)));

    System.out.println(format);

使用FieldPosition你真的不必关心日期的格式是否包括年份为“yy”或“yyyy”,其中年份最终甚至使用哪种分隔符。

您只需使用年份字段的开始和结束索引,并始终将其替换为4位年份值,就是这样。

答案 1 :(得分:2)

java.time

这是现代的答案。恕我直言,这些天没有人应该与长期过时的DateFormatSimpleDateFormat课程斗争。他们的替代品出现在现代Java日期和版本中。时间API 2014年初,java.time classes

我只是将Happier’s answer的想法应用到现代课程中。

DateTimeFormatterBuilder.getLocalizedDateTimePattern方法为Locale生成日期和时间样式的格式设置模式。我们操纵生成的模式字符串以强制使用4位数年份。

LocalDate date = LocalDate.of( 2017, Month.JULY, 18 );

String formatPattern =
    DateTimeFormatterBuilder.getLocalizedDateTimePattern(
        FormatStyle.SHORT, 
        null, 
        IsoChronology.INSTANCE, 
        userLocale);
formatPattern = formatPattern.replaceAll("\\byy\\b", "yyyy");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatPattern, userLocale);

String output = date.format(formatter);

示例输出:

  • Locale.US7/18/2017
  • 对于UKFRANCEGERMANYITALY18/07/2017中的每一个。

DateTimeFormatterBuilder允许我们直接获取本地化格式模式字符串,而不首先获取格式化程序,这在这里很方便。 getLocalizedDateTimePattern()的第一个参数是日期格式样式。 null作为第二个参数表示我们不希望包含任何时间格式。在我的测试中,我使用了LocalDate date,但代码也适用于其他现代日期类型(LocalDateTimeOffsetDateTimeZonedDateTime)。

答案 2 :(得分:0)

我有类似的方法,但我需要获取ui控制器的语言环境模式。

所以这是代码

            // date format, always using yyyy as year display
        DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, locale);
        SimpleDateFormat simple = (SimpleDateFormat) dateFormat;
        String pattern = simple.toPattern().replaceAll("\\byy\\b", "yyyy");
        System.out.println(pattern);

答案 3 :(得分:-1)

你能不能只使用java.text.DateFormat类?

DateFormat uk = DateFormat.getDateInstance(DateFormat.LONG, Locale.UK);
DateFormat us = DateFormat.getDateInstance(DateFormat.LONG, Locale.US);

Date now = new Date();
String usFormat = us.format(now);
String ukFormat = uk.format(now);

那应该做你想做的事。