GWT — Преобразование форматирования даты

#java #datetime #gwt #formatting

#java #дата и время #gwt #форматирование

Вопрос:

У меня есть следующий метод:

 public static String formatDate(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    Calendar today = Calendar.getInstance();
    Calendar yesterday = Calendar.getInstance();
    yesterday.add(Calendar.DATE, -1);
    DateFormat timeFormatter = new SimpleDateFormat("hh:mma");
    DateFormat dateTimeFormatter = new SimpleDateFormat("MMM d, yyyy - hh:mma");

    if (calendar.get(Calendar.YEAR) == today.get(Calendar.YEAR) amp;amp; calendar.get(Calendar.DAY_OF_YEAR) == today.get(Calendar.DAY_OF_YEAR) amp;amp; calendar.get(Calendar.HOUR_OF_DAY) == today.get(Calendar.HOUR_OF_DAY) amp;amp; calendar.get(Calendar.MINUTE) == today.get(Calendar.MINUTE)) {
        return "few seconds ago ";
    } else if (calendar.get(Calendar.YEAR) == today.get(Calendar.YEAR) amp;amp; calendar.get(Calendar.DAY_OF_YEAR) == today.get(Calendar.DAY_OF_YEAR) amp;amp; calendar.get(Calendar.HOUR_OF_DAY) == today.get(Calendar.HOUR_OF_DAY)) {
        return "few minutes ago ";
    } else if (calendar.get(Calendar.YEAR) == today.get(Calendar.YEAR) amp;amp; calendar.get(Calendar.DAY_OF_YEAR) == today.get(Calendar.DAY_OF_YEAR)) {
        return "today "   timeFormatter.format(date);
    } else if (calendar.get(Calendar.YEAR) == yesterday.get(Calendar.YEAR) amp;amp; calendar.get(Calendar.DAY_OF_YEAR) == yesterday.get(Calendar.DAY_OF_YEAR)) {
        return "yesterday "   timeFormatter.format(date);
    } else {
        return dateTimeFormatter.format(date);
    }
}
  

Как мне написать это в GWT на стороне клиента?

Ответ №1:

Есть четыре способа сделать это, которые приходят мне в голову:

  1. Делайте это не на стороне клиента, а на стороне сервера. Календарь не эмулируется в GWT на стороне клиента.
  2. Если вы должны сделать это на стороне клиента, попробуйте использовать устаревшие методы в классе Date. Они все еще работают, и все они устарели в пользу методов в Календаре, так что вы просто немного откатите время назад.
  3. Говоря об откате часов назад, вы также можете просто откатиться вперед, как это было. Эмуляция календаря приближается к GWT, по крайней мере, это то, что я читал. Вы могли бы сделать (1) на данный момент, а затем перенести этот метод на клиент, когда появится календарь. В качестве альтернативы, вы могли бы сделать (2) на данный момент и поменять его на свой исходный код на основе календаря, когда появится Calendar.
  4. Используйте метод getTime() для Date (который не устарел и эмулируется GWT на стороне клиента) и выполняйте прямые сравнения целых чисел, чтобы определить, какую строку возвращать. getTime() возвращает миллисекунды, поэтому «несколько секунд назад» будет разницей в 60 000 миллисекунд или меньше, «несколько минут назад» будет разницей в 3 600 000 миллисекунд или меньше, и так далее.

Выберите 4.

Используйте методы в com.google.gwt.i18n.client.DateTimeFormat для форматирования даты / времени.

Ответ №2:

gwttime — это порт Joda-Time для GWT, и он очень полезен для работы с периодами времени и длительностями.

В вашем случае вы могли бы создать либо DateTime s, либо LocalDateTime s, а затем создать a Period с обоими из них, чтобы найти количество секунд, минут, часов, дней и т.д. между ними.

Например:

 private static int daysBetween(LocalDateTime start, LocalDateTime end) {
    return new Period(start, end, PeriodType.days()).getDays();
}
  

Это позволит найти количество полных дней между start и end .

Вы можете повторять это в течение секунд, минут и т. Д. И выполнять некоторую нечеткую логику с результатами, чтобы получить желаемую выходную строку.