Я пробовал много способов отобразить разницу между двумя временами, но не могу найти решение:

long strt = System.currentTimeMillis();//1462968291733
Thread.sleep(5000);
long end = System.currentTimeMillis();//1462968296733

long diff = end - strt;

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(diff);
TimeZone timeZone = TimeZone.getTimeZone("IST");
calendar.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));

System.out.println(calendar.getTime());//05:30:05

Выводится неверный вывод:

Чт, 01 января, 05:30:05 IST 1970

Результат должен быть

Чт, 01 января, 00:00:05 IST 1970

0
Mahender Ambala 11 Май 2016 в 15:14

3 ответа

Лучший ответ

Вы путаетесь с часовым поясом. Попробуйте следующее:

long strt = System.currentTimeMillis();// 1462968291733
    Thread.sleep(5000);
    long end = System.currentTimeMillis();// 1462968296733

    long diff = end - strt;


    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(diff);
    TimeZone cutsomTimeZone = TimeZone.getTimeZone("IST");

     DateFormat formatter = new SimpleDateFormat
                ("EEE MMM dd HH:mm:ss zzz yyyy");
    formatter.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
    System.out.println(formatter.format(calendar.getTime()));//

    formatter.setTimeZone(cutsomTimeZone);
    System.out.println(formatter.format(calendar.getTime()));

Во-первых, как сказано в javadoc, System.currentMillis() возвращает количество миллисекунд с 1 января 1970 года в UTC , что явно отличается от IST.

Во-вторых, объект Date, возвращаемый calendar.getTime(), не имеет часового пояса. В выводе, который вы получаете с System.out.println(calendar.getTime()), используется значение по умолчанию для вашей системы TimeZone, которое выглядит как IST.

В-третьих, пожалуйста, не используйте API Date, это действительно плохо. По возможности предпочитайте java.time.

3
ortis 11 Май 2016 в 12:39

Это связано с тем, что для печати по умолчанию используется локаль по умолчанию, которой в вашем случае является +5:30.

Вам нужно будет отформатировать вывод в нужном часовом поясе, например. с помощью SimpleDateFormat:

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(sdf.format(calendar.getTime()));
2
dejvuth 11 Май 2016 в 12:39

ответ dejvuth и ответ Орриса оба верны.

Избегайте старых классов даты и времени . Они были заменены в Java 8 и более поздних версиях тегом java.time framework. Для Java 6 & amp; 7, большая часть функциональных возможностей была перенесена в проект ThreeTen-Backport и дополнительно адаптирована на Android с помощью проекта ThreeTenABP.

Нет необходимости указывать часовые пояса для регистрации прошедшего времени.

Instant представляет собой момент на временной шкале в формате UTC с разрешением до наносекунд. В Java 8 текущий момент фиксируется с разрешением только миллисекунд, но новая реализация из Clock на Java 9 будет захватывать до наносекунд в зависимости от технических возможностей вашего компьютера.

Instant start = Instant.now();
…
Instant stop = Instant.now();

Duration захватывает промежуток времени как общее количество целых секунд и доли секунды как наносекунды. Это значение не привязано к временной шкале.

Duration duration = Duration.between( start , stop );

Классы java.time используют стандарт ISO 8601 при создании текстового представления даты и времени. значение. В течение двух с половиной секунд вы получите значение типа PT2.5S, где P обозначает начало (для периода), а T разделяет любые годы-месяцы-дни. от часов-минут-секунд. Этот формат предотвращает двусмысленность формата часов, где 00:00:02.5 выглядит как время дня на две минуты после полуночи. Но если хотите, можете спросить Duration о числах.

String output = duration.toString();
0
Community 23 Май 2017 в 10:28