2013-05-13 5 views
0

Скажем, у меня есть разница между двумя часамиПреобразовать в миллисекундах отформатированный время

java.text.DateFormat f = new java.text.SimpleDateFormat("HH:mm"); 
java.util.Date checkIn = f.parse("00:00"); 
java.util.Date checkOut = f.parse("05:00"); 

Long timeDifference = new Long(checkOut.getTime() - checkIn.getTime()); 

я могу узнать, сколько часов этот интервал имеет путем деления «timeDifference» на 3600000 (один час в миллисекундах), и я получаю правильный результат, 5.

Но когда я пытаюсь преобразовать «timeDifference» как так:

Calendar cal = new GregorianCalendar(); 
cal.setTime(new Date(timeDifference)); 
DateFormat formatter = new SimpleDateFormat("HH:mm"); 
formatter.format(cal.getTime()); 

я «2:00» ... Почему? Как я могу форматировать «timeDifference»?

EDIT: Мне не нужны даты. Я просто хочу разницу между checkIn и checkOut в hoursformatted как HH: mm.

ответ

0

Я получаю «02:00» ... Почему? Как я могу форматировать «timeDifference»?

Вы несколько неправильно используете эти классы. Я предполагаю, что вы находитесь в московском часовом поясе, который был в GMT + 3 в 1970 году.

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

0

cal.setTime(new Date(timeDifference)): То, что вы здесь делаете, устанавливает время до timeDifference (18000000) миллисекунд после 1 января 1970 года по Гринвичу. (Если бы вы изменили свой SimpleDateFormat, чтобы показать дату, а также время, это будет очевидно). Вы получаете 02:00, потому что это то, что было в вашем часовом поясе 18000000 миллисекунд после полуночи (GMT) 1 января 1970 года. Когда я запускаю ваш код (в Калифорнии), он дает мне 21:00, потому что мы 4 часа позади вас.

Кажется, что вы не понимаете, как работает класс Calendar - см. Документацию here. Помимо этого, ваш вопрос не дает понять, что именно вы пытаетесь достичь. Надеюсь, с лучшим пониманием Календаря вы сможете это выяснить самостоятельно - если нет, отредактируйте свой вопрос и сообщите нам, что именно вам нужно.

0

Основная проблема заключается в том, что разница во времени не является датой/меткой времени. Он не представляет собой «момент времени». Интерфейс DateFormat ... и классы, которые его реализуют, предназначены для форматирования вещей, которые представляют собой момент времени.

Я получаю «02:00» ... Почему?

Что вы получаете, когда вы анализируете и не просматриваете значения времени с помощью DataFormat, является значением даты для «сегодня». То, что происходит следующим образом:

  1. «00:00» -> обрабатывается как полночь сегодня в локальной временной зоне == t1 миллисекунд с начала эпохи.

  2. «05:00» -> Рассматривается как 5 утра сегодня в локальном часовом поясе = t2 миллисекунды с эпохи.

  3. t2 - t1 -> 5 часов (в миллисекундах)

  4. Дата (t2 - t1) -> 5 часов после эпохи

  5. (через 5 часов после эпохи) как значение в местный часовой пояс «1970-01-01T02: 00: 00»

  6. Теперь выбросьте все, кроме часов и минут.

Как форматировать "timeDifference"?

Простой способ заключается в использовании long арифметику, чтобы превратить разницу во времени в целые часы и минуты, а затем, используя формат String.format(...) или эквивалент с использованием фиксированных полей ширины и дополнение нулями.

1

Попробуйте это:

DateFormat format = new SimpleDateFormat("yyyy-MM-dd.HH:mm:ss"); 
Date zeroDt = new Date(0); 
System.out.println(format.format(zero)); 

вы получите:

1970-01-01.02:00:00 

Эта дата (1 января, 1970, 2:00) является начало оси.

Теперь попробуйте:

java.text.DateFormat f = new java.text.SimpleDateFormat("HH:mm"); 
Date checkIn = f.parse("00:00"); 
Date checkOut = f.parse("05:00"); 
System.out.println(checkIn.getTime()); 
System.out.println(checkOut.getTime()); 

Вы получаете:

-7200000 
10800000 

Как вы можете видеть, CheckIN является отрицательным (-2 часа). Вот почему checkOut.getTime() - checkIn.getTime() дает 5 часов - (-2 часа) = 7 часов.

Вы должны иметь в виду, что date.getTime() отрицательно относится к датам до 1970-01-01.02: 00: 00.

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