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块中,以防遇到不寻常的情况。“您对“您可以尝试…”和“为大多数人工作…”有什么不理解的?