Как получить разницу во времени между двумя датами в миллисекундах с помощью JodaTime

Я собираюсь разработать приложение, в котором мне нужно получить точную разницу во времени между двумя датами. Бывший:

Date1:31/05/2011 12:54:00
Date2:31/05/2011 13:54:00

Я пытался использовать getTime(), но не получил точного результата.

Ожидаемый результат для вышеуказанных входных данных составляет 3600000 (60 * 60 * 1000) миллисекунд, но я получаю 46800000 (13 * 60 * 60 * 1000).

Когда я просматривал разные java-форумы, люди предлагали использовать JodaTime.

Тем не менее я не могу получить точный результат.

Я работаю в часовом поясе Лондона (GMT).


person madhu    schedule 13.07.2011    source источник
comment
Если вы получаете разницу в 13 часов вместо разницы в один час: проверяли ли вы, что это не 12:00 и 13:00, когда вы выполняете расчет? Что-то в этом роде было бы моей первой мыслью.   -  person Andrzej Doyle    schedule 13.07.2011
comment
Кроме того, вы должны знать, что часовой пояс Лондона не GMT, а Europe/London. Они выглядят одинаково, пока вы не столкнетесь с крайним случаем (например, с переходом на летнее время), а затем вы удивитесь, почему все ваши часы отличаются на один час.   -  person Andrzej Doyle    schedule 13.07.2011


Ответы (5)


Инициируйте два dateTime и используйте Period :

DateTime dt1 = new DateTime(2013,9,11,9,58,56);
DateTime dt2 = new DateTime(2013,9,11,9,58,59);
Period p = new Period(dt1, dt2, PeriodType.millis());

Чтобы получить разницу в миллисекундах:

System.out.println(p.getValue(0));
person skulled    schedule 18.09.2013
comment
использование p.getMillis() было бы лучше, чем ссылка на индекс - person Andre; 10.11.2014
comment
Класс периода joda-time (начиная с joda-time 2.9.9) поддерживает только значения int в поле миллисекунд, поэтому этот подход ломается, когда разница между двумя датами в миллисекундах переполняет целочисленное хранилище. Чтобы увидеть, как он ломается, измените dt1 на dt1 = new DateTime(1970, 1, 1, 0, 0, 0); - person Peter; 07.08.2017

Проверьте secondsBetween()

Создает Seconds, представляющий количество полных секунд между двумя указанными частичными датами и временем. Два частичных элемента должны содержать одни и те же поля, например, вы можете указать два объекта LocalTime.

Параметры:

 start - the start partial date, must not be null
    end - the end partial date, must not be null 

Возвращает:

 the period in seconds 
person Saurabh Gokhale    schedule 13.07.2011

JodaTime использует машинное время внутри. Таким образом, чтобы найти миллисекунды, вы можете использовать константу, хранящую LocalDateTime, относящуюся к 1 января 1970 г. (из-за UNIX Time< /а>).

Время Unix, или время POSIX, — это система для описания моментов времени, определяемая как количество секунд, прошедших с полуночи по универсальному скоординированному времени (UTC) 1 января 1970 года, не считая високосных секунд. Затем вычислите разницу между вашим DateTime.

Я пробовал так;

public static void main(String[] args) {
        final LocalDateTime JAN_1_1970 = new LocalDateTime(1970, 1, 1, 0, 0);
        DateTime local = new DateTime().withZone(DateTimeZone.forID("Europe/Amsterdam"));
        DateTime utc = new DateTime(DateTimeZone.UTC);

        System.out.println("Europe/Amsterdam milis :" + new Duration(JAN_1_1970.toDateTime(DateTimeZone.forID("Europe/Amsterdam")), local).getMillis());
        System.out.println("UTC  milis             :" + new Duration(JAN_1_1970.toDateTime(DateTimeZone.UTC), utc).getMillis());

    }

И результат есть;

Europe/Amsterdam milis :1429695646528
UTC  milis             :1429692046534

И @leonbloy напишите здесь хороший комментарий.

Ваш местный и utc представляют одни и те же моменты времени (только с разными часовыми поясами). Следовательно, getMillis() (который дает «физический» интервал времени, прошедший с «моментального момента», соответствующего эпохе unix), должен возвращать то же значение.

person Semih Eker    schedule 22.04.2015

Joda - идеальная библиотека, но если вам нужна разница между двумя датами в миллисекундах, вам просто нужно вычислить разницу между getTime(). Если вы получаете неправильные результаты, у вас есть проблемы с часовыми поясами или около того. Обычно это работает.

person AlexR    schedule 13.07.2011
comment
Joda — идеальная библиотека… посмотрите на реализацию new DateTime((Date)null) и скажите мне об этом :) - person skaffman; 13.07.2011

person    schedule
comment
Это, пожалуй, самый эффективный способ сделать это. +1 за это. - person groo; 08.11.2014