Преобразование строки в миллисекунды

Я хочу рассчитать разницу во времени между двумя датами (в формате "yyyyMMddHHmmss" ). Основная идея состоит в том, чтобы сначала преобразовать дату строки в миллисекунды, а затем получить разницу во времени.

Calendar c1 = Calendar.getInstance();
c1.setTime(new SimpleDateFormat("yyyyMMddHHmmss").parse("20110327032913"));
System.out.println(c1.getTimeInMillis());
Calendar c2 = Calendar.getInstance();
c2.setTime(new SimpleDateFormat("yyyyMMddHHmmss").parse("20110327025913"));     
System.out.println(c2.getTimeInMillis());

Результат:

1301189353000

1301191153000

Очевидно, что первая дата позже второй, но ее преобразованная миллисекунда меньше. Я сделал ошибку в формате?

Ответ 1

Разница во времени между двумя временными метками в мс составляет 30 минут:

1301191153000 - 1301189353000 = 1800000ms = 30 min

Из-за изменений DST на 27 марта часы устанавливаются в 2 часа с 2:00 до 3:00, поэтому отметки времени:

20110327032913 => 2011-03-27 03:29:13

20110327025913 => 2011-03-27 02:59:13

на самом деле интерпретируются как:

2011-03-27 03:29:13

2011-03-27 03:59:13 (+1 hour from original time)

Таким образом, вторая временная метка приходит позже и при преобразовании в ms она больше, чем первая.

Ответ 2

Готов поспорить, что вы находитесь в локали, где время было изменено с 2 часов утра до 3 часов ночи для летнего времени 27 марта 2011 года (см. эта ссылка)

В первый раз

2011 03 27 03 29 13
yyyy MM dd HH mm ss

и ваш второй раз

2011 03 27 02 59 13 // does not exist because of time change
yyyy MM dd HH mm ss

так на самом деле, ваш второй раз:

           ,,
2011 03 27 03 59 13
yyyy MM dd HH mm ss

что, очевидно, на 30 минут позже первого (а не на 30 минут раньше).

Ответ 3

Возможно, этот код может вам помочь:

        Calendar c1 = Calendar.getInstance(TimeZone.getTimeZone("UTC"));            
        Calendar c2 = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));       

        c1.setTime(sdf.parse("20110327032913"));
        System.out.println(c1.getTimeInMillis());

        c2.setTime(sdf.parse("20110327025913"));     
        System.out.println(c2.getTimeInMillis());
                    System.out.println((c1.getTimeInMillis()-c2.getTimeInMillis())/(1000*60)+ " minutes");

* Проблема в том, что если ваша строка не указана в UTC, вы, возможно, никогда не узнаете, было ли применено изменение времени, поэтому интервал может составлять один час.