Рассчитайте разницу между двумя разами, учитывая, что у нас есть две разные строки для времени и даты - PullRequest
6 голосов
/ 27 февраля 2011

У меня есть данные о времени, разделенные на две строки - одну для даты и одну для времени.
Я хочу рассчитать разницу. таких два раза в Java.
например

  • время 1: «26/02/2011» и «11:00 AM»
  • время 2: «27.02.2011» и «00:15»

Разница составит 13 часов 15 минут.

Ответы [ 6 ]

11 голосов
/ 27 февраля 2011
String str_date1 = "26/02/2011";
String str_time1 = "11:00 AM";

String str_date2 = "27/02/2011";
String str_time2 = "12:15 AM" ;

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm a");
Date date1 = formatter.parse(str_date1 + " " + str_time1);
Date date2 = formatter.parse(str_date2 + " " + str_time2);

// Get msec from each, and subtract.
long diff = date2.getTime() - date1.getTime();

System.out.println("Difference In Days: " + (diff / (1000 * 60 * 60 * 24)));

Obs: это действительно только как приблизительное.См. Потеря времени на Садовой дорожке .)

7 голосов
/ 27 февраля 2011
try {
    String date1 = "26/02/2011";
    String time1 = "11:00 AM";
    String date2 = "27/02/2011";
    String time2 = "12:15 AM";

    String format = "dd/MM/yyyy hh:mm a";

    SimpleDateFormat sdf = new SimpleDateFormat(format);

    Date dateObj1 = sdf.parse(date1 + " " + time1);
    Date dateObj2 = sdf.parse(date2 + " " + time2);
    System.out.println(dateObj1);
    System.out.println(dateObj2);

    long diff = dateObj2.getTime() - dateObj1.getTime();
    double diffInHours = diff / ((double) 1000 * 60 * 60);
    System.out.println(diffInHours);
    System.out.println("Hours " + (int)diffInHours);
    System.out.println("Minutes " + (diffInHours - (int)diffInHours)*60 );

} catch (ParseException e) {
    e.printStackTrace();
}

выход

Sat Feb 26 11:00:00 EST 2011
Sun Feb 27 00:15:00 EST 2011
13.25
Hours 13
Minutes 15.0
1 голос
/ 27 февраля 2011

Сначала необходимо преобразовать строки в java.util.Date объекты (например, используя SimpleDateFormat.parse(String)). Затем вы можете использовать Date.getTime() для каждого из двух проанализированных вами экземпляров Date и вычислять разницу в миллисекундах или использовать java.util.Calendar или API времени joda для расширенных вычислений.

1 голос
/ 27 февраля 2011

Посмотрите на DateFormat , вы можете использовать его для разбора ваших строк с помощью метода parse (String source), и вы можете легко манипулировать двумя объектами Dates, чтобы получить то, что вы хотите.

DateFormat df = DateFormat.getInstance();
Date date1 = df.parse(string1);
Date date2 = df.parse(string2);
long difference = date1.getTime() - date2.getTime();
Date myDate = new Date(difference);

Показать дату:

String diff = df.format(myDate);
0 голосов
/ 08 декабря 2016

ТЛ; др

Duration.between(
    ZonedDateTime.of(
        LocalDate.parse( "26/02/2011" , DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ) ,
        LocalTime.parse( "11:00 AM" , DateTimeFormatter.ofPattern( "hh:mm a" ) ) ,
        ZoneId.of( "America/Montreal" )
    )
    ,
    ZonedDateTime.of(
        LocalDate.parse( "27/02/2011" , DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ) ,
        LocalTime.parse( "12:15 AM" , DateTimeFormatter.ofPattern( "hh:mm a" ) ) ,
        ZoneId.of( "America/Montreal" )
    )
).toString()

См. живой код в IdeOne.com .

Часовой пояс

Вопрос и другие ответы игнорируют критическую проблему часового пояса. Вы не можете рассчитать прошедшее время между двумя строками даты и времени, не зная предполагаемого часового пояса. Например, в местах с переходом на летнее время (DST) в ночь перерыва день может длиться 23 часа или 25 часов, а не 24 часа.

java.time

Современный способ работы с датой и временем - с помощью классов java.time. Они вытесняют неприятные старые классы даты и времени, такие как java.util.Date и java.util.Calendar.

Local…

Сначала проанализируйте входные строки. В них отсутствует указание часового пояса, поэтому мы анализируем их как Local… типов.

Определите DateTimeFormatter, чтобы соответствовать вашим строковым входам. Кстати, в будущем используйте стандартные форматы ISO 8601 при сериализации значений даты и времени в текст.

DateTimeFormatter df = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate ld = LocalDate.parse( "26/02/2011" , df ) ;

ld.toString (): 2011-02-2011

DateTimeFormatter tf = DateTimeFormatter.ofPattern( "hh:mm a" );
LocalTime lt = LocalTime.parse( "11:00 AM" , tf ) ;

lt.toString (): 11: 00: 00

ZoneId

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

Укажите собственное имя часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте 3-4-буквенное сокращение, например EST или IST, поскольку они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" );

ZonedDateTime

Примените зону, чтобы получить ZonedDateTime.

ZonedDateTime zdtStart = ZonedDateTime.of( ld , lt , z );

zdtStart.toString (): 2011-02-26T11: 00: 00-05: 00 [Америка / Монреаль]

Duration

Сделайте то же самое, чтобы получить zdtStop. Рассчитайте прошедшее время как промежуток времени, не привязанный к временной шкале, в виде Duration.

Duration d = Duration.between( zdtStart , zdtStop );

Позвоните toString, чтобы сгенерировать строку в стандартном формате ISO 8601 для длительностей : PnYnMnDTnHnMnS. P отмечает начало, а T разделяет две части.

String output = d.toString();

d.toString (): PT13H15M

В Java 9 и более поздних версиях вызывайте методы to…Part для доступа к каждому компоненту.


О java.time

Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на java.time классы.

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Где получить классы java.time?

  • Java SE 8 и SE 9 и более поздние
    • Встроенный.
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функций java.time перенесена в Java 6 & 7 в ThreeTen-Backport .
  • Android

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 08 декабря 2016

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

Вы можете рассчитать дни, часы и минуты

public class TimeUtils {

public static final String HOURS = "hours";
public static final String MINUTES = "minutes";
public static final String DAYS = "days";

 public static int findTheNumberBetween(String type, Date day1, Date day2) {

    long diff = day2.getTime() - day1.getTime();
    switch (type) {
        case DAYS:
            return (int) TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
        case HOURS:
            return (int) TimeUnit.HOURS.convert(diff, TimeUnit.MILLISECONDS);
        case MINUTES:
            return (int) TimeUnit.MINUTES.convert(diff, TimeUnit.MILLISECONDS);
    }
    return 0;
}
}

и использовать его как

  Date day1= TimeUtils.getDateTime("2016-12-08 02:06:14");
    Date day2 = TimeUtils.getDateTime("2016-12-08 02:10:14");

    Log.d(TAG, "The difference: "+TimeUtils.findTheNumberBetween(TimeUtils.MINUTES,day1,day2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...