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 в дату является чувствительной к часовому поясу операцией, поэтому я даю часовой пояс в коде. Пожалуйста, поместите тот, который вы хотите, где я положил Америку / Whitehorse. Если вы уверены, что настройка часового пояса JVM отражает то, что хочет пользователь, вы можете использовать ZoneId.systemDefault()
(SimpleDateFormat
в вашем собственном коде также использует настройку VM).
Ссылки