Вычисление разницы во времени в Google App Engine/Java

Я работаю над движком приложения Google. И я работаю над чем-то, что требует от меня что-то сделать, если разница во времени между временем, отправленным клиентом, и временем на сервере составляет менее 15 секунд. Код отлично работает, когда я пробую его на тестовом сервере (на своей машине). Но терпит неудачу, когда я развертываю код на движке приложения. Я предполагаю, что это, вероятно, потому, что если часовой пояс на сервере отличается, при этом может быть добавлено/вычтено несколько часов.

Что я в основном делаю, так это позволяю клиенту отправлять свою временную метку вместе с другими данными. И когда впоследствии серверу нужно вычислить разницу во времени, я вычитаю временную метку сервера из временной метки клиента.

Если часовой пояс другой, то, очевидно, у меня возникнут проблемы.

Я знаю, что одно из решений, позволяющее избежать этого фиаско с часовым поясом, состоит в том, чтобы позволить серверу ставить метку времени как для первоначального запроса, так и для последующей обработки позже, но для моего приложения важно, чтобы таймер начинал тикать сразу после того, как клиент делает запрос, и что если Прошло 15 секунд по отношению к клиенту, после чего сервер не предпринимает никаких действий.

Поскольку я являюсь разработчиком как клиентской, так и серверной части, я могу показать вам, что я сделал.

Пример звонка на стороне клиента

new Register().sendToServer(username,location,new TimeStamp(new Date().getTime()));

это сохраняется в хранилище данных и извлекается немного позже, если выполняются некоторые условия.

Пример на стороне сервера для поиска различий

Date date= new Timestamp(new Date().getTime());
Date d1 = (Date) timeStampList[i];
long timedif = Math.abs(d1.getTime() - date.getTime());
if(timedif <= 15000)
    do something;
else
    do something else;

В общем, мой вопрос: как мне нормализовать вариации часового пояса?

Благодарность


person user1881220    schedule 06.12.2012    source источник
comment
Это не имеет никакого отношения к часовому поясу: getTime возвращает миллисекунды с полуночи, 01.01.1970 по Гринвичу. Когда вы распечатываете timedif, что вы получаете? Это 30 секунд или три часа? Это может быть просто из-за того, что ваши часы и часы сервера отстают более чем на 15 секунд.   -  person Diego Basch    schedule 06.12.2012


Ответы (2)


Просто используйте абсолютное время Unix: System.currentTimeMillis().

Это время является абсолютным, т. е. количество миллисекунд с 1 января 1970 года, полночь UTC), поэтому вы можете просто вычислить разницу.

person Peter Knego    schedule 06.12.2012

Как указал @Diego Basch, если разница во времени составляет от 30 минут до полных часов, вам следует иметь дело с разницей часовых поясов, потому что ваш клиент не находится в том же часовом поясе, что и сервер.

Вы можете определить часовой пояс клиента в JavaScript с помощью new Date().getTimezoneOffset(). Примечание: смещение относительно UTC возвращается в минутах.

На сервере вы сможете определить часовой пояс с помощью Calendar.getInstance().getTimeZone().

person Moritz Petersen    schedule 06.12.2012