Есть ли исходный код для перевода timeInMills на 24 часа / дату, как в приложении для обмена сообщениями. Когда timeInMills меньше 24 часов, он вернется, как этот 16:15, но когда он больше 24 часов, он вернется как этот THU at 16:15. В настоящее время я создаю приложение для чата и хочу добавить его в свое приложение.
Вы имеете в виду, если это больше 24 часов тому назад?




Редактировать
Остерегайтесь этой строки: long last24hTimestamp = current - MILLISECONDS_PER_DAY;
Я рассчитываю по всемирному координированному времени.
Чтобы узнать местное время, следует учитывать часовой пояс.
Таким образом, в основном вам нужно рассчитать, находится ли временная метка timeInMillis в пределах последних 24 часов, затем используйте один формат, иначе используйте другой формат.
Это поможет вам:
public static final long MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;// In real app you should pre-calculate this value
public static final String RECENT_DATE_FORMAT = "HH:mm";
public static final String OLD_DATE_FORMAT = "E' at 'HH:mm";
public static String displayTime(long timestamp) {
long current = System.getCurrentTimeMillis();
long last24hTimestamp = current - MILLISECONDS_PER_DAY;
if (timestamp > last24hTimestamp) {
// Received message within a day, use first format
SimpleDateFormat sdf = new SimpleDateFormat(RECENT_DATE_FORMAT);
return sdf.format(new Date(timestamp));
} else {
// Message is older than 1 day. Use second format
}
}
То, о чем вам следует позаботиться:
Рассмотрите возможность синтаксического анализа с использованием часового пояса / локализации, если ваше приложение работает в нескольких местах.
Если вы используете java 8, попробуйте использовать DateTimeFormatter. Это потокобезопасный, и вы можете использовать статический экземпляр для формата даты, нет необходимости инициализировать SimpleDateFormat каждый раз, когда вы хотите отформатировать дату.
Для работы с датой и временем в Java я рекомендую java.time, современный Java API даты и времени.
static DateTimeFormatter lessThan24HoursAgoFormatter
= DateTimeFormatter.ofPattern("HH:mm", Locale.ENGLISH);
static DateTimeFormatter moreThan24HoursAgoFormatter
= DateTimeFormatter.ofPattern("EEE 'at' HH:mm", Locale.ENGLISH);
static ZoneId zone = ZoneId.of("America/Yakutat");
public static String getDisplayString(long timeInMills) {
ZonedDateTime dateTime = Instant.ofEpochMilli(timeInMills)
.atZone(zone)
.truncatedTo(ChronoUnit.MINUTES);
ZonedDateTime currentTimeYesterday = ZonedDateTime.now(zone).minusDays(1);
if (dateTime.isAfter(currentTimeYesterday)) {
return dateTime.format(lessThan24HoursAgoFormatter);
} else {
return dateTime.format(moreThan24HoursAgoFormatter);
}
}
Бег только сейчас
getDisplayString(1_525_402_083_258L) вернул Thu at 18:48.getDisplayString(1_525_490_972_172L) вернул только 19:29.Пожалуйста, укажите желаемый часовой пояс там, где я поставил Америка / Якутат. Я рекомендую вам вставлять проверки, что миллис означает время, которое наступило не более недели назад и не в будущем, поскольку возвращаемая строка в этих случаях может сбивать с толку.
Также возможно, что существует библиотека, которая будет форматировать строку, подобную тому, что вы хотите. Используйте свою поисковую систему.
java.time на Android?Да, java.time прекрасно работает на старых и новых устройствах Android. Просто требуется как минимум Java 6.
org.threeten.bp и подпакетов.java.time.
Это от разницы текущего времени и конкретной публикации? Мне неизвестен конкретный вызов библиотеки, но я обычно устанавливаю конкретный формат для даты (например, «ЧЧ: мм» или «ддд ЧЧ: мм») в зависимости от разницы во времени. Вы можете включить месяцы или годы, если промежуток времени достаточен (например, Linux
lsпредоставляет информацию). См. Как вы форматируете дату и время