Превращение timeInMills в 24 часа / Дата - PullRequest
0 голосов
/ 05 мая 2018

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

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

java.time

Для работы с датами или временем в Java я рекомендую java.time, современный Java-интерфейс даты и времени.

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 (от 26 уровня API, как мне сказали) новый API поставляется встроенным.
  • В Java 6 и 7 получают ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310, где впервые был описан современный API).
  • На (более старом) Android используйте Android-версию ThreeTen Backport. Это называется ThreeTenABP. Убедитесь, что вы импортируете классы даты и времени из пакета org.threeten.bp и подпакетов.

Ссылки

0 голосов
/ 05 мая 2018

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

Остерегайтесь этой строки: long last24hTimestamp = current - MILLISECONDS_PER_DAY;

Я рассчитываю от имени времени UTC.

Чтобы узнать местное время, вы должны принять во внимание часовой пояс.


Таким образом, в основном вы должны вычислить, находится ли отметка времени 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 каждый раз, когда вы хотите отформатировать дату

...