如何获取具有特定模式的语言环境中的日期格式?

时间:2018-07-02 06:49:11

标签: java android datetime simpledateformat

搜索后,我找不到解决此问题的方法。

我有这个:

Long parseDt = Long.valueOf(arrayJson.getJSONObject(i-j).getInt("dt")); // dt is a timestamp
Locale locale = ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
String date = new SimpleDateFormat("EEE d MMM", locale).format(new java.util.Date(parseDt * 1000));

因此,该模式有效,但是当我更改电话语言时,它没有交换其显示方式,我想说明的是,如果电话语言是法语,它将显示这样的日期,这对于大多数欧洲语言:

  

lun 2 juil

如果我将语言切换为英语,它将显示如下日期:

  

7月2日

代替:

  

7月2日星期一

您知道我要使用最多3个字符的日期作为名称吗?

可以使用现有的预定义格式(例如FULL),但是可以完全显示日期,例如,它是“星期一”,而我只希望“星期一”,而不是“星期一”,所以,您有什么想法吗? / p>

3 个答案:

答案 0 :(得分:0)

您可以根据所获得的语言环境切换格式。

Locale locale = ConfigurationCompat.getLocales(
                   Resources.getSystem().getConfiguration()).get(0);

String fmt = (locale == Locale.ENGLISH) ? "EEE MMM d" : "EEE d MMM";
String date = new SimpleDateFormat(fmt, locale)
                   .format(new java.util.Date(parseDt * 1000));

答案 1 :(得分:0)

Java已经“知道”月份中哪个日期在月份名称之前以及之后哪个名称。这就是完整的预定义格式给您的。因此,对于可能在所有或大多数语言环境中都能使用的通用解决方案,我建议您依靠它。我们可以修改预定义的完整模式以在星期几和月份中使用缩写:

    int parseDt = arrayJson.getJSONObject(i-j).getInt("dt"); // dt is a timestamp
    Locale locale = ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
    String formatPattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
            FormatStyle.FULL, null, IsoChronology.INSTANCE, locale);
    formatPattern = formatPattern.replaceAll("E{3,}", "EEE").replaceAll("M{3,}", "MMM");
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(formatPattern, locale);
    ZoneId zone = ZoneId.of("America/Whitehorse");
    ZonedDateTime dateTime = Instant.ofEpochSecond(parseDt).atZone(zone);
    String date = dateTime.format(dateFormatter);
    System.out.println(date);

示例输出:

  • 在英国语言环境中:Mon, 2 Jul 2018
  • 在美国语言环境中:Mon, Jul 2, 2018
  • 在法语语言环境中:lun. 2 juil. 2018

我正在使用正则表达式来确保如果星期几和/或月份在格式模式字符串中(例如EEEEMMMM),则将其修改为缩​​写。由于星期几也可以用小写的ec来表示,月份也可以用L来表示,因此您可能希望对这些字母进行相同的操作。

我正在使用java.time,这是现代的Java日期和时间API。要在非全新的Android上使用此功能,请获取ThreeTenABP库:使用底部的链接。如果您反对使用高质量的,面向未来的外部库,则可以使用SimpleDateFormat来发挥类似的作用。

如果您也想省略年份(如您的示例所示),则稍微复杂一些,但可行。这是删除年份的简单尝试:

    formatPattern = formatPattern.replaceFirst("^(.*[\\w'])([^\\w']*y+)$", "$1");

例如,插入此行后,法语区域的输出仅为lun. 2 juil.。年份也可以用字母u给出,您也可能要考虑这一点。

将Unix时间转换为日期是对时区敏感的操作,因此我在代码中给出了时区。请把您想要的那个放在我放在美国/怀特霍斯的地方。如果您相信JVM的时区设置可以反映用户的需求,则可以使用ZoneId.systemDefault()(您自己的代码中的SimpleDateFormat也使用VM设置)。

链接

答案 2 :(得分:0)

根据国家/地区的日期格式:

https://en.wikipedia.org/wiki/Date_format_by_country

以及我的应用需求,我选择了最简单的显示方式:

int parseDt = arrayJson.getJSONObject(i-j).getInt("dt"); // dt is a timestamp
Locale locale = ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
String dateFormat = ((locale.equals(Locale.US) || locale.equals(Locale.CHINA) || locale.equals(Locale.CANADA) || locale.equals(Locale.JAPAN)) ? "EEE, MMM d" : "EEE d MMM";
String date = new SimpleDateFormat(dateFormat, locale).format(new java.util.Date(parseDt * 1000));