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

发布于 2024-12-10 09:25:49 字数 271 浏览 0 评论 0 原文

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

我尝试使用

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

但是对于美国区域设置来实现它,格式是错误的。

是否有一种常见的方法来格式化日期,以根据区域设置更改模式?

谢谢

I need to build a date format like dd/MM/yyyy. It's almost like DateFormat.SHORT, but contains 4 year digits.

I try to implement it with

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

However for US locale the format is wrong.

Is there a common way to format date that changes pattern based on locale?

Thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

战皆罪 2024-12-17 09:25:49

我会这样做:

    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 位数的年份值即可。

I would do it like this:

    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);

Using a FieldPosition you don't really have to care about wheter the format of the date includes the year as "yy" or "yyyy", where the year ends up or even which kind of separators are used.

You just use the begin and end index of the year field and always replace it with the 4 digit year value and that's it.

东北女汉子 2024-12-17 09:25:49

java.time

这是现代的答案。恕我直言,现在没有人应该与早已过时的 DateFormatSimpleDateFormat 类作斗争。他们的替代品出现在现代 Java date & 中。 time API 于 2014 年初推出,java.time 类

我只是将Happier的答案中的想法应用到现代课程中。

DateTimeFormatterBuilder.getLocalizedDateTimePattern 方法生成 区域设置。我们操纵生成的模式字符串来强制使用 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
  • 对于英国法国德国意大利18/07/2017

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

java.time

Here’s the modern answer. IMHO these days no one should struggle with the long outdated DateFormat and SimpleDateFormat classes. Their replacement came out in the modern Java date & time API early in 2014, the java.time classes.

I am just applying the idea from Happier’s answer to the modern classes.

The DateTimeFormatterBuilder.getLocalizedDateTimePattern method generates a formatting pattern for date and time styles for a Locale. We manipulate the resulting pattern string to force the 4-digit year.

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);

Example output:

  • For Locale.US: 7/18/2017.
  • For each of UK, FRANCE, GERMANY and ITALY: 18/07/2017.

DateTimeFormatterBuilder allows us to get the localized format pattern string directly, without getting a formatter first, that’s convenient here. The first argument to getLocalizedDateTimePattern() is the date format style. null as second argument indicates that we don’t want any time format included. In my test I used a LocalDate for date, but the code should work for the other modern date types too (LocalDateTime, OffsetDateTime and ZonedDateTime).

寄离 2024-12-17 09:25:49

我有类似的方法来做到这一点,但我需要获取 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);

I have similar way to do this, but I need to get the locale pattern for the ui controller.

So here's the code

            // 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);
愚人国度 2024-12-17 09:25:49

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

那应该做你想做的事。

Can you not just use java.text.DateFormat class ?

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);

That should do what you want to do.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文