代码之家  ›  专栏  ›  技术社区  ›  Farrukh Najmi

Java:如何以区域设置敏感的方式显示工作日、月份、日期和年份

  •  1
  • Farrukh Najmi  · 技术社区  · 6 年前

    在我的应用程序中,我需要以地区敏感的方式显示日期。因此,“2018年5月10日星期四”应按en\U US的原样显示,但应按en\U GB(英国)的原样显示为“2018年5月10日星期四”。

    在大多数情况下,我可以在java中使用以下风格的代码。时间API类:

    public String toString(ZonedDateTime input) {
        DateTimeFormatter dateTimeFormatter = getDateTimeFormatter(FormatStyle.MEDIUM, FormatStyle.SHORT);
        return input.format(dateTimeFormatter);
    }
    
    private DateTimeFormatter getDateTimeFormatter(FormatStyle dateStyle, FormatStyle timeStyle) {
        String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
                dateStyle, timeStyle, IsoChronology.INSTANCE, Locale.getDefault());
    
        return DateTimeFormatter.ofPattern(pattern);
    }
    

    在这种情况下,我不指定显式的日期模式,而是指定符号格式样式。

    如果没有符合我需求的标准格式样式,我不确定处理这种情况的最佳方法。

    一个具体的例子是,我需要显示星期几、月份和日期,但不显示年份。

    因此,“2018年5月10日星期四”在Enu US中应显示为“5月10日星期四”,但在Enu GB(英国)中应显示为“5月10日星期四”。

    对如何处理这一要求有何建议?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Anonymous    6 年前
        String formatPattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
                FormatStyle.FULL, null, IsoChronology.INSTANCE, loc);
        formatPattern = formatPattern.replaceFirst("^.*?([MLdEec].*[MLdEec]).*$", "$1");
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(formatPattern, loc);
        System.out.println(LocalDate.now(ZoneId.of("Pacific/Johnston")).format(dateFormatter));
    

    输出带 loc 等于 Locale.US :

    5月10日,星期四

    Locale.UK (英国):

    5月10日,星期四

    工作原理:我从本地化格式模式字符串开始。在正则表达式中,我识别与月份相关的格式模式字母( ML ),月日( d )和星期几( Eec ).我保留了从第一个字母到最后一个字母的子字符串。领先的不情愿量词 .*? 确保我得到第一个匹配的字母。如果某个地区将年份放在所需元素之间的某个位置,它最终将被包括在内。

    我觉得自己太有创意了。在决定想要这样的东西之前,请使用您能想到的所有测试示例进行测试。

        2
  •  1
  •   Michael    6 年前

    您可以使用

    DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)
    

    将使用默认的系统区域设置。如果要选择显式区域设置(用于测试),那么可以使用 withLocale

    DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)
        .withLocale(Locale.US);
    

    下面是一个示例:

    DateTimeFormatter pattern = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)
        .withLocale(Locale.US);
    
    System.out.println(
        LocalDate.of(1999, 1, 1).format(pattern)
    );
    

    输出: Jan 1, 1999

    如果我将区域设置更改为 Locale.UK 输出变为 1 Jan 1999


    要获取星期几,可以使用

    DayOfWeek.from(myDate).getDisplayName(TextStyle.FULL, Locale.getDefault())
    

    然后连接字符串。(再次使用 Locale 以查看不同的结果。 Locale.GERMAN 给你 Freitag )

        3
  •  0
  •   Mạnh Quyết Nguyễn    6 年前

    尝试本地化日期格式化程序:

    DateTimeFormatter pattern = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withLocale(Locale.US);