努力尽今夕,少年犹可夸。这篇文章主要讲述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你试图使用长期过时和臭名昭着的麻烦类
DateFormat
和SimpleDateFormat
。相反,我建议您养成使用现代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。
org.threeten.bp
和org.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。
为了获得更多信息,您最好通过this文档
Editted【Android - 显示不同日期格式的月份名称】你可以尝试这种方式:
int monthOfYear = Calendar.JULY;
// 6
String monthName = new
DateFormatSymbols(Locale.getDefault()).getShortMonths()[monthOfYear];
推荐阅读
- Android 7本地化问题
- 阿拉伯语言可能不会在Android Studio 2.3 XML预览中显示
- Apple Watch基本本地化显示错误的默认语言
- Android(如何在build.gradle中获取资源字符串以支持多种语言的多种口味())
- Android多语言支持(由于占位符计数不同导致的字符串格式问题)
- Android Wear没有拿起本地化版本
- 本地化不适用于App的初始加载
- timeago相当于Android
- 在Android和Raspberry Pi 3 Linux之间建立Wifi-Direct连接