Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于区域设置的SimpleDataFormat模式,但强制使用4位数的年份_Java_Locale_Simpledateformat - Fatal编程技术网

Java 基于区域设置的SimpleDataFormat模式,但强制使用4位数的年份

Java 基于区域设置的SimpleDataFormat模式,但强制使用4位数的年份,java,locale,simpledateformat,Java,Locale,Simpledateformat,我需要构建一个日期格式,如dd/MM/yyyy。它几乎类似于DateFormat.SHORT,但包含4个年份数字 我试着用 new SimpleDateFormat("dd//MM/yyyy", locale).format(date); 然而,对我们来说,格式是错误的 是否有一种根据区域设置更改模式的日期格式的通用方法 谢谢你你不能只使用java.text.DateFormat类吗 DateFormat uk = DateFormat.getDateInstance(DateFormat.L

我需要构建一个日期格式,如
dd/MM/yyyy
。它几乎类似于
DateFormat.SHORT
,但包含4个年份数字

我试着用

new SimpleDateFormat("dd//MM/yyyy", locale).format(date);
然而,对我们来说,格式是错误的

是否有一种根据区域设置更改模式的日期格式的通用方法


谢谢你

你不能只使用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);

这应该是你想做的。

我会这样做:

    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”还是“yyy”,年份在哪里结束,甚至不必关心使用了哪种分隔符


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

我也有类似的方法,但我需要获取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);
java.time 这是现代的答案。我认为,现在没有人应该与早已过时的
DateFormat
SimpleDateFormat
类作斗争。2014年初,现代Java date&time API发布了它们的替代品

我只是把这个想法应用到现代课堂上

该方法为一个对象的日期和时间样式生成格式模式。我们操纵生成的模式字符串以强制执行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.US
    2017年7月18日
  • 对于英国、
    法国
    德国
    意大利
    2017年7月18日

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

您到底想在这里做什么:为不同的地区使用不同的日期格式,或者使用不受区域设置影响的格式?我正在尝试为不同的区域设置不同的日期格式。例如,dd/MM/yyyy适用于欧洲地区,MM/dd/yyyy适用于美国地区请注意,并非所有欧洲国家都遵循
dd/MM/yyyy
模式,相当多的国家使用
dd.MM.yyyyy
,有些国家甚至使用
dd-MM-yyyyy
。谢谢,我刚刚给出了一个示例,他想要一个本地化的DateFormat。四位数年份的短模式。对,我误读了一些代码。那样的话。。。执行上述操作(将长替换为短)。。。然后在将DateFormat转换为SimpleDataFormat后调用toPattern(),然后搜索yy并将其替换为yyyy。然后用新的字符串模式创建一个新的SimpleDataFormat。仍然是错误的。不能期望DateFormat.getDateInstance返回的实例为SimpleDateFormat类型。这是wierd。。。因为javadoc声明“如果你愿意,你也可以在格式上设置时区。如果你想对格式或解析有更多的控制,(或者想给你的用户更多的控制权),您可以尝试将从factory方法获得的日期格式转换为SimpleDateFormat。这对大多数国家都适用;只要记住将其放在一个try块中,以防遇到不寻常的情况。“您对“您可以尝试…”和“为大多数人工作…”有什么不理解的?