Перевод timeInMills на 24 часа / дату

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

Это от разницы текущего времени и конкретной публикации? Мне неизвестен конкретный вызов библиотеки, но я обычно устанавливаю конкретный формат для даты (например, «ЧЧ: мм» или «ддд ЧЧ: мм») в зависимости от разницы во времени. Вы можете включить месяцы или годы, если промежуток времени достаточен (например, Linux ls предоставляет информацию). См. Как вы форматируете дату и время

KevinO 05.05.2018 05:02

Вы имеете в виду, если это больше 24 часов тому назад?

Ole V.V. 05.05.2018 07:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
2
124
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Редактировать

Остерегайтесь этой строки: 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

  }

}

То, о чем вам следует позаботиться:

  1. Рассмотрите возможность синтаксического анализа с использованием часового пояса / локализации, если ваше приложение работает в нескольких местах.

  2. Если вы используете java 8, попробуйте использовать DateTimeFormatter. Это потокобезопасный, и вы можете использовать статический экземпляр для формата даты, нет необходимости инициализировать SimpleDateFormat каждый раз, когда вы хотите отформатировать дату.

java.time

Для работы с датой и временем в 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.

  • В Java 8 и новее, а также на новых устройствах Android (как мне сказали, начиная с уровня API 26) новый API встроен.
  • В Java 6 и 7 есть ThreeTen Backport, резервный порт для новых классов (ThreeTen для JSR 310, где впервые был описан современный API).
  • На (более ранней) версии Android используйте версию ThreeTen Backport для Android. Он называется ThreeTenABP. Убедитесь, что вы импортировали классы даты и времени из пакета org.threeten.bp и подпакетов.

Ссылки

Другие вопросы по теме