搜索后,我找不到解决此问题的方法。
我有这个:
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>
答案 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
我正在使用正则表达式来确保如果星期几和/或月份在格式模式字符串中(例如EEEE
和MMMM
),则将其修改为缩写。由于星期几也可以用小写的e
或c
来表示,月份也可以用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设置)。
java.time
。java.time
。java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。答案 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));