#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:
Есть четыре способа сделать это, которые приходят мне в голову:
- Делайте это не на стороне клиента, а на стороне сервера. Календарь не эмулируется в GWT на стороне клиента.
- Если вы должны сделать это на стороне клиента, попробуйте использовать устаревшие методы в классе Date. Они все еще работают, и все они устарели в пользу методов в Календаре, так что вы просто немного откатите время назад.
- Говоря об откате часов назад, вы также можете просто откатиться вперед, как это было. Эмуляция календаря приближается к GWT, по крайней мере, это то, что я читал. Вы могли бы сделать (1) на данный момент, а затем перенести этот метод на клиент, когда появится календарь. В качестве альтернативы, вы могли бы сделать (2) на данный момент и поменять его на свой исходный код на основе календаря, когда появится Calendar.
- Используйте метод 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
.
Вы можете повторять это в течение секунд, минут и т. Д. И выполнять некоторую нечеткую логику с результатами, чтобы получить желаемую выходную строку.