2012-05-08 4 views
3

У меня есть фрагмент кода, который находит разницу между двумя датами (в формате yyyy-MM-dd hh: mm: ss). Этот код запускается на нескольких серверах по всему миру. Одна из двух дат - это текущее время в конкретном часовом поясе, в котором выполняется код (время сервера), а другое - время, полученное из базы данных. если разница между этими двумя временами превышает 86400 секунд (1день), тогда она должна печатать «недействительный», иначе должна быть напечатана «valid». Проблема, с которой сталкивается код, когда я запускаю его на своем локальном компьютере, работает нормально, но когда я развертываю его на сервере в США, он учитывает время GMT, а не местное время. Везде, где выполняется код, я хочу разницу между текущим временем и временем, полученным из базы данных, и если оно больше 86400 секунд, я хочу напечатать недействительным. Как достичь этого в java? PS: Я пробовал объект Date, но его рассмотрение GMT ​​только везде.Как найти разницу между двумя датами в секундах в разных часовых поясах

+0

Будет ли работать с вами по умолчанию TimeZone ?: http://docs.oracle.com/javase/7/docs/api/java/util/TimeZone.html#setDefault(java.util.TimeZone) –

+0

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

ответ

5

Я бы использовал GMT везде и только конвертировал в местное время для показа.

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

2

Вы можете сделать это в нижеследующем примере кода.

Date date = new Date(); 

DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z"); 
formatter.setTimeZone(TimeZone.getTimeZone("CET")); 

Date date1 = dateformat.parse(formatter.format(date)); 

// Set the formatter to use a different timezone 
formatter.setTimeZone(TimeZone.getTimeZone("IST")); 

Date date2 = dateformat.parse(formatter.format(date)); 
// Prints the date in the IST timezone 
// System.out.println(formatter.format(date)); 

Теперь сравните date1 с date2

0

Во-первых, я согласен с ответом Питера Lawrey в там. Обычно хорошей практикой является сохранение всего времени в базе данных для одной зоны и визуализация ее со смещением для пользователя на основе локали пользователя.

Чтобы найти разницу, используйте метод getTime(), чтобы получить время в миллисекундах от эпохи для каждой даты. Расчет разницы в 1 день составляет 86400 * 1000 миллисекунд. Или, возможно, сохраните время в миллисекундах с эпохи в базе данных и используйте процедуру/функцию БД во время извлечения.

Надеюсь, это поможет.

Смежные вопросы