Как использовать java.util.Calendar в GWT

Мне нужно использовать java.util.Calendar в точке входа GWT, но при запуске приложения у меня возникла ошибка, потому что GWT не может найти исходный код, так или иначе я могу исправить эту проблему.

Спасибо заранее!

Ответ 1

java.util.Calendar не является эмулированным классом. Здесь вы можете найти список эмулируемых классов:

http://code.google.com/webtoolkit/doc/latest/RefJreEmulation.html

Я бы настоятельно советовал не использовать какую-либо библиотеку даты/календаря на стороне клиента. Вы, вероятно, только попадете в беду. На самом деле, хотя java.sql.Date и java.util.Date эмулируются в GWT, я бы тоже не использовал их. Если вы хотите использовать Календарь, то, скорее всего, вы хотите поддерживать часовые пояса на клиенте. Используя эмулированные классы Date, вам нужно каким-то образом преобразовать дату клиента из часовой пояс браузера в какой-либо целевой часовой пояс (GMT или любой пользователь, определенный в пользовательских настройках?). Это, безусловно, будет подвержено ошибкам. Использование GWT TimeZone добавляет другие проблемы. Например, как вы сопоставляете между часами Java и часовыми поясами GWT?

Я рекомендую делать все манипуляции и форматирование даты на сервере. На клиенте вы можете просто использовать триплет даты/месяца/года. Сервер может иметь связь между пользователем (или организацией) и java.util.TimeZone(или часовой пояс joda). Используя триплет и часовой пояс, вы можете легко создать конкретный экземпляр вовремя.

Ответ 2

Возможно, вы сможете использовать com.google.gwt.user.datepicker.client.CalendarUtil.

Ответ 3

Нет никакого способа использовать java.util.Calendar в GWT, потому что в JavaScript нет эквивалента. Но для него есть принятый запрос функции. Возможно, вы найдете некоторые подсказки в комментариях запроса.

Ответ 4

Ниже показано, как использовать Joda Time для извлечения любой информации о дате из типа Java Date с помощью функции Joda Times format() и использовать ее для создания new Date() с использованием функции Joda Time parse().

static DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd HH:mm:ss.SSS");
static DateTimeFormat datefmt = DateTimeFormat.getFormat("yyyy-MM-dd ");
static DateTimeFormat timefmt = DateTimeFormat.getFormat("HH:mm:ss.SSS");

public Date getDateTime(Date date, Date time) {
    String datetime = datefmt.format(date) + timefmt.format(time);
    return dtf.parse(datetime);
}

Ответ 5

Вы пытались добавить фактический код класса в свой проект? Некоторые классы Java SDK хорошо компилируются, даже если они не включены в белый список JRE.

Ответ 6

Для тех, кто предпочитает непосредственно выполнять математику, вот решение о том, как добавлять дни к существующему объекту даты без использования Календаря или любых устаревших функций:

private Date addDays(Date dateIn, int numDays)
{
   long milisPerDay = 86400000;

   // convert the dateIn to milliseconds
   long dateInMilis = dateIn.getTime();

   // add numDays to the date
   dateInMilis = dateInMilis + (numDays * milisPerDay);

   return new Date(dateInMilis);
}


Здесь, как получить текущий год как String (очень полезно для уведомлений об авторских правах)

long time = System.currentTimeMillis();
long milisPerYear = new BigInteger("31536000000").longValue();
String currentYear = String.valueOf((int) Math.floor(time / milisPerYear) + 1970);

Поиск констант, таких как количество милисекунд в день, год и т.д., легко с Google. Сложная часть - это добавление месяцев, поскольку количество миллисекунд в месяц будет зависеть от месяца. Если у вас есть спрос на это, я был бы счастлив написать функцию и опубликовать ее здесь, чтобы добавить и вычесть месяцы.