Android - 显示不同日期格式的月份名称

努力尽今夕,少年犹可夸。这篇文章主要讲述Android - 显示不同日期格式的月份名称相关的知识,希望能为你提供帮助。
我有一个应用程序,以不同区域的本地化格式显示日期和时间,即 - 它根据自己的偏好显示用户日期和时间。但我的问题是它总是显示数字,即yyyy.mm.dd,或mm / dd / yyy,或者dd,mm,yyyy。我想要的是:显示日期以便日期是数字,年份是数字,但月份显示为字符串,即。 Jan / Xin / Gen /Jān/ Yan ...或2018年1月201日/ Jan 01 2018/2018 Jan 01,依此类推,但仍保留当前的本地格式。我知道如果我像MMM一样对其进行硬编码,我可以这样做,但我希望它能够根据本地化格式进行更改。
所以基本上这是我的问题:如何从服务器获取的值(yyyy-MM-dd HH:mm:ss)显示本地化时间,月份显示为三个字母的单词,无论它使用何种语言环境?
我知道这个问题听起来很熟悉,但到目前为止,我已经尝试了很多答案,包括堆栈溢出和其他来源,但没有任何成功。我尝试过的一些事情包括:1 / 2 / 3 / 4 / 5 / 6 ......但我无法在我的例子中使它成功。
我的适配器:

public void onBindViewHolder(RestaurantsAdapter.RestaurantsViewHolder holder, int position) { // getting restaurant data for the row Restaurant restaurant = restaurant Items.get(position); holder.userName.setText(restaurant .getUserName()); holder.date.setText(convertDate(restaurant .getDateTime())); //string dobiti u formatu, pretvoriti ga u localized i podijeliti na dva dijela holder.time.setText(convertTime(restaurant .getDateTime())); TextDrawable.IBuilder builder = TextDrawable.builder() .beginConfig() .withBorder(0) .toUpperCase() .endConfig() .roundRect(10); ColorGenerator generator = ColorGenerator.MATERIAL; int color = generator.getColor(restaurant.getUserId()); TextDrawable textDrawable = builder.build(restaurant Items.get(position).getUserName().substring(0, 1), color); holder.thumbNail.setImageDrawable(textDrawable); Picasso.with(context) .load(AppConfig.URL_PROFILE_PHOTO + restaurant.getThumbnailUrl()) .placeholder(textDrawable) .error(textDrawable) .transform(new RoundedTransform(12, 0)) .fit() .centerCrop() .into(holder.thumbNail); } private String convertDate(String time) { final DateFormat shortDateFormat = android.text.format.DateFormat.getDateFormat(context.getApplicationContext()); SimpleDateFormat dateFormatReceived = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); SimpleDateFormat dateFormatConverted = new SimpleDateFormat(((SimpleDateFormat) shortDateFormat).toPattern(), Locale.getDefault()); java.util.Date date = null; try { date = dateFormatReceived.parse(time); } catch (ParseException e) { e.printStackTrace(); }return dateFormatConverted.format(date); }private String convertTime(String time) { final DateFormat shortTimeFormat = android.text.format.DateFormat.getTimeFormat(context.getApplicationContext()); SimpleDateFormat timeFormatReceived = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); SimpleDateFormat timeFormatConverted = new SimpleDateFormat(((SimpleDateFormat) shortTimeFormat).toPattern(), Locale.getDefault()); java.util.Date date = null; try { date = timeFormatReceived.parse(time); } catch (ParseException e) { e.printStackTrace(); }return timeFormatConverted.format(date); }

更新:
我尝试将此添加到我的解决方案:
private String convertDate(String time) { final DateFormat shortDateFormat = android.text.format.DateFormat.getDateFormat(context.getApplicationContext()); Calendar Now = Calendar.getInstance(); Now.getDisplayName(Calendar.HOUR, Calendar.SHORT, Locale.getDefault()); SimpleDateFormat dateFormatReceived = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); SimpleDateFormat dateFormatConverted = new SimpleDateFormat(((SimpleDateFormat) shortDateFormat).toPattern(), Locale.getDefault()); dateFormatConverted.getDisplayName(Calendar.HOUR, Calendar.SHORT, Locale.getDefault()); java.util.Date date = null; try { date = dateFormatReceived.parse(time); } catch (ParseException e) { e.printStackTrace(); }return dateFormatConverted.format(date); }

答案我认为以下方法将为您提供所需的日期时格式化程序。
public static DateTimeFormatter getLocalizedDateFormatter(Locale requestedLocale) { String formatPatternString = DateTimeFormatterBuilder.getLocalizedDateTimePattern( FormatStyle.SHORT, null, Chronology.ofLocale(requestedLocale), requestedLocale); // if not already showing month name, modify so it shows abbreviated month name if (! formatPatternString.contains("MMM")) { formatPatternString = formatPatternString.replaceAll("M+", "MMM"); } return DateTimeFormatter.ofPattern(formatPatternString, requestedLocale); }

测试:
Locale[] locales = { Locale.US, Locale.FRANCE, Locale.GERMANY, Locale.forLanguageTag("da-DK"), Locale.forLanguageTag("sr-BA") }; LocalDate today = LocalDate.now(ZoneId.of("Europe/Sarajevo")); for (Locale currentLocale : locales) { DateTimeFormatter ldf = getLocalizedDateFormatter(currentLocale); System.out.format(currentLocale, "%-33S%s%n", currentLocale.getDisplayName(), today.format(ldf)); }

输出:
ENGLISH (UNITED STATES)Dec/24/17 FRENCH (FRANCE)24/déc./17 GERMAN (GERMANY)24.Dez.17 DANSK (DANMARK)24-dec.-17 SERBIAN (BOSNIA AND HERZEGOVINA) 17-дец-24

JSR-310也称为java.time你试图使用长期过时和臭名昭着的麻烦类DateFormatSimpleDateFormat。相反,我建议您养成使用现代Java日期和时间API JSR-310的习惯。所以我在上面的方法中这样做。
我不认为这是问题的一部分,但为了完整起见,解析日期时间字符串如下。您从getLocalizedDateFormatter获得的格式化程序可用于格式化LocalDateTime和许多其他日期时间类型以及LocalDate
LocalDateTime ldt = LocalDateTime.parse("2017-12-24 22:51:34", DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss")); String formattedDate = ldt.format(getLocalizedDateFormatter(Locale.UK));

问:我可以用技术JSR-310在Android?是的你可以。它至少需要Java 6。
  • 在Java 8及更高版本中,新的API内置。
  • 在Java 6和7中获取ThreeTen Backport,这是新类的后端(JST 310的ThreeTen)。
  • 在Android上,使用Android版的ThreeTen Backport。它被称为ThreeTenABP。
在后两种情况下,请确保将适当版本的backport库添加到项目中,使用下面的链接,并从org.threeten.bporg.threeten.bp.format导入我使用的类。
链接
  • Oracle tutorial: Date Time,解释如何使用java.time
  • ThreeTen Backport project
  • ThreeTenABP,Android版ThreeTen Backport
  • Question: How to use ThreeTenABP in Android Project,有一个非常彻底的解释。
  • Java Specification Request (JSR) 310,首次描述现代日期和时间API。
另一答案请尝试使用getDisplayName(...)方法
为了获得更多信息,您最好通过this文档
Editted【Android - 显示不同日期格式的月份名称】你可以尝试这种方式:
int monthOfYear = Calendar.JULY; // 6 String monthName = new DateFormatSymbols(Locale.getDefault()).getShortMonths()[monthOfYear];


    推荐阅读