2016-10-27 5 views
3

У меня есть эта проблема с вычислением разницы во времени в минутах. Его прекрасно работать с exampples как вычисления разности между 2045 и 2300.Java - разница во времени в минутах

Но когда я хочу, чтобы вычислить разницу между, например 2330 (сегодня) и 0245 (завтра) я получаю неправильный ответ. код ниже:

// This example works 
    String dateStart = "2045"; 
    String dateStop = "2300"; 

    // This example doesnt work 
    //String dateStart = "2330"; 
    //String dateStop = "0245"; 

    // Custom date format 
    SimpleDateFormat format = new SimpleDateFormat("HHmm"); 

    Date d1 = null; 
    Date d2 = null; 
    try { 
     d1 = format.parse(dateStart); 
     d2 = format.parse(dateStop); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    }  

    long diff = d2.getTime() - d1.getTime(); 
    long minutes = TimeUnit.MILLISECONDS.toMinutes(diff);      
    System.out.println("Time in minutes: " + minutes + " minutes."); 

Заранее спасибо

+1

Вам нужно добавить 1 день в 'd2'. –

+4

Подумайте, как ваша программа могла знать, что время не с текущего дня. – jhamon

+0

@Semith Как вы решили свои вещи? Был ли мой ответ на любую помощь? Каковы правильные ответы? Благодарю. –

ответ

-1

Это решаемая проблема. Если посмотреть на библиотеке Joda времени вы найдете функцию манипуляции даты все время, и вы, возможно, хотите:

В вашем случае что-то вдоль линий:

DateTime first = new DateTime(larger-time); 
DateTime second = new DateTime(smaller-time); 
DateTime difference = first.minusMillis(second.getMillis()) 

Joda справится со всеми нечетные граничные условия, такие как перекатывание между днями/месяцами/годами, длительность месяцев, високосные годы, переход на летнее время, временные интервалы ...

+0

Ничего себе! тонну голосов за использование уважаемой библиотеки. Любое тело заботится, чтобы объяснить, почему – Stormcloud

+2

Исходная версия вашего ответа не имела никакого полезного ответа, только предложение пойти посмотреть библиотеку. Тем не менее, почему возникает зависимость от сторонней библиотеки, когда [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) в основном то же самое и не требует никаких зависимостей? – VGR

+0

А, да. Я собрал быстрый ответ, а затем отредактировал его, чтобы включить пример. Когда я закончил, у меня было 3 голоса - менее 3 минут! Хуже того, ответы во всех случаях не будут работать. Вы правы, что java.time - это то же самое, но это только Java 8. – Stormcloud

2

Это не работает, потому что, когда вы создаете новую дату с таким количеством времени, предполагая, что день «сегодня».

Что вы можете сделать, это:

// This example works 
String dateStart = "2045"; 
String dateStop = "2300"; 

// This example doesnt work 
//String dateStart = "2330"; 
//String dateStop = "0245"; 

// Custom date format 
SimpleDateFormat format = new SimpleDateFormat("HHmm"); 

Date d1 = null; 
Date d2 = null; 
try { 
    d1 = format.parse(dateStart); 
    d2 = format.parse(dateStop); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

// MY ADDITION TO YOUR CODE STARTS HERE 
if(d2.before(d1)){ 
    Calendar c = Calendar.getInstance(); 
    c.setTime(d2); 
    c.add(Calendar.DATE, 1); 
    d2 = c.getTime(); 
} 
// ENDS HERE 

long diff = d2.getTime() - d1.getTime(); 
long minutes = TimeUnit.MILLISECONDS.toMinutes(diff);      
System.out.println("Time in minutes: " + minutes + " minutes."); 

Но вы должны рассмотреть возможность использования Java 8 новой Дата функции/времени, или Joda времени.

+0

Время Joda (или функции Java 8) является единственным надежным способом решения этой проблемы. – Stormcloud

+1

Хотя функции Java 8, безусловно, являются улучшением, я считаю ответ полностью надежным, и я призываю вас, @Stormcloud, указать, каким образом это не так (я не знаю, время Джоды достаточно хорошо, чтобы иметь квалифицированное мнение). –

+0

Это сработало, спасибо большое. И не могли бы вы связать меня с новой функцией Java 8? Еще новичок в Java и не знает о новой функции. – Semih

1

Вы можете добавить, если заявление, чтобы проверить это сегодня, а если нет вы не можете добавить один день к этому, так как вы сравниваете время он не будет проблемой, если вы добавите полный день

if(d2.before(d1)){ 
     d2.setTime(d2.getTime()+86400000); 
    } 

Попробуйте из

+0

Это намного лучше, чем мой оригинальный способ сделать это в моем ответе. Я обновил свой ответ с помощью вашего кода. Благодаря! – jchampemont

+0

86400000 предполагает, что все дни имеют ровно 24 часа. Это не подходит для дневного сбережения – Stormcloud

+0

Это не так, поскольку он всегда добавляет 24 часа до 1 января 1970 года –

2

Рассмотрите возможность использования LocalDate, LocalDateTime, LocalTimeZonedDateTime классов из пакета java.time.* введен в Java 8. они очень удобны в использовании, поскольку они могут решать различные случаи угловых (измерение минут в различных часовых поясах, или во время осеннего и весеннего времени, например, изменение).

Вещь вы должны знать, когда вы вычислить разницу во времени является то, что:

  • LocalTime содержит время только
  • LocalDate содержит только дату (без времени)
  • LocalDateTime содержит оба (дата + время.)
  • ZonedDateTime содержит дату + время + часовой пояс

Это означает, что разница между временами будет отличаться, если вы сравните с:

  • МестноеВремя вы можете дифф только время, так 20 : 45 и 23:30 дает 2:45 разницы
  • LocalDate вы не можете рассчитывать любые временные посмотреть различия (не содержит времени)
  • LocalDateTime Вы можете указать дату и время и т.д .: 20:45 1Jan и 23:30 3Jan. Разница во времени составит 2:45 и 2 дня разницы, или 50:45.
  • ZonedDateTime - такой же, как LocalDateTime плюс вы учитывает DayLightSavings, поэтому если часы меняется на ночь - это будут отражены.

Вот отрывок для LocalDateTime:

LocalDateTime today2045 = LocalDateTime.of(
      LocalDate.now(), 
      LocalTime.parse("20:45")); 
    LocalDateTime tomorrow0230 = LocalDateTime.of(
      LocalDate.now().plusDays(1), 
      LocalTime.parse("02:30")); 

    System.out.println("Difference [minutes]: " + 
      Duration.between(today2045, tomorrow0230).toMinutes()); 

Для ZonedDateTime с учетом изменений тактовыми счета весна/осень:

ZonedDateTime today2045 = ZonedDateTime.of(
      LocalDate.now(), 
      LocalTime.parse("20:45"), 
      ZoneId.systemDefault()); 
    ZonedDateTime tomorrow0230 = ZonedDateTime.of(
      LocalDate.now().plusDays(1), 
      LocalTime.parse("02:30"), 
      ZoneId.systemDefault()); 

    System.out.println("Difference [minutes]: " + 
      Duration.between(today2045, tomorrow0230).toMinutes()); 

Некоторая информация о конструкторах можно найти в Oracle's tutorial here.

+0

Почему downvoting? Это отвечает на вопросы и соответствует последней рекомендации (???). –

+0

Возможно, голосует из-за публикации одного и того же материала в двух ответах на этот вопрос? –

+0

@Basil Bourqe: Нет. Сначала этот голос был первым. Я думаю, что я редактировал его, и к тому времени, когда я закончил, я получил голос. –

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