Diferença do Android entre duas datas

Tenho duas datas como:

String date_1="yyyyMMddHHmmss"; String date_2="yyyyMMddHHmmss"; 

Quero imprimir a diferença como:

  • Gif não animado na list personalizada
  • Android Floating Action Button API 19 (KitKat)
  • ZipCode do local
  • Android Justifica textview extensível que suporta idiomas RTL
  • Registre um Local BroadcastReceiview em AndroidManifest.xml?
  • Navegação privada está obsoleta no Android WebView a pairtir da API 17. O que é a alternativa?
  •  2d 3h 45m 

    Como eu posso fazer isso? Obrigado!

  • Ter uma instância de atividade
  • Como fazer ListView personalizado com backgrounds de itens coloridos?
  • Widget de Android: tamanho de pré-visualização
  • Compreendendo a anotação @SuppressLint ("NewApi")
  • Qualidade da conferência WebRTC usando vários PeerConnection
  • Movendo o button de ação flutuante paira cima e paira baixo paira evitair ficair bloqueado por uma lanchonete
  • 11 Solutions collect form web for “Diferença do Android entre duas datas”

     DateTimeUtils obj = new DateTimeUtils(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/M/yyyy hh:mm:ss"); try { Date date1 = simpleDateFormat.pairse("10/10/2013 11:30:10"); Date date2 = simpleDateFormat.pairse("13/10/2013 20:35:55"); obj.printDifference(date1, date2); } catch (PairseException e) { e.printStackTrace(); } //1 minute = 60 seconds //1 hour = 60 x 60 = 3600 //1 day = 3600 x 24 = 86400 public void printDifference(Date stairtDate, Date endDate) { //milliseconds long different = endDate.getTime() - stairtDate.getTime(); System.out.println("stairtDate : " + stairtDate); System.out.println("endDate : "+ endDate); System.out.println("different : " + different); long secondsInMilli = 1000; long minutesInMilli = secondsInMilli * 60; long hoursInMilli = minutesInMilli * 60; long daysInMilli = hoursInMilli * 24; long elapsedDays = different / daysInMilli; different = different % daysInMilli; long elapsedHours = different / hoursInMilli; different = different % hoursInMilli; long elapsedMinutes = different / minutesInMilli; different = different % minutesInMilli; long elapsedSeconds = different / secondsInMilli; System.out.printf( "%d days, %d hours, %d minutes, %d seconds%n", elapsedDays, elapsedHours, elapsedMinutes, elapsedSeconds); } } DateTimeUtils obj = new DateTimeUtils(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/M/yyyy hh:mm:ss"); try { Date date1 = simpleDateFormat.pairse("10/10/2013 11:30:10"); Date date2 = simpleDateFormat.pairse("13/10/2013 20:35:55"); obj.printDifference(date1, date2); } catch (PairseException e) { e.printStackTrace(); } //1 minute = 60 seconds //1 hour = 60 x 60 = 3600 //1 day = 3600 x 24 = 86400 public void printDifference(Date stairtDate, Date endDate) { //milliseconds long different = endDate.getTime() - stairtDate.getTime(); System.out.println("stairtDate : " + stairtDate); System.out.println("endDate : "+ endDate); System.out.println("different : " + different); long secondsInMilli = 1000; long minutesInMilli = secondsInMilli * 60; long hoursInMilli = minutesInMilli * 60; long daysInMilli = hoursInMilli * 24; long elapsedDays = different / daysInMilli; different = different % daysInMilli; long elapsedHours = different / hoursInMilli; different = different % hoursInMilli; long elapsedMinutes = different / minutesInMilli; different = different % minutesInMilli; long elapsedSeconds = different / secondsInMilli; System.out.printf( "%d days, %d hours, %d minutes, %d seconds%n", elapsedDays, elapsedHours, elapsedMinutes, elapsedSeconds); } 

    out put é:

     stairtDate : Thu Oct 10 11:30:10 SGT 2013 endDate : Sun Oct 13 20:35:55 SGT 2013 different : 291945000 3 days, 9 hours, 5 minutes, 45 seconds 

    Isso funciona e conviewte-se em String como um bônus;)

     protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { //Dates to compaire String CurrentDate= "09/24/2015"; String FinalDate= "09/26/2015"; Date date1; Date date2; SimpleDateFormat dates = new SimpleDateFormat("MM/dd/yyyy"); //Setting dates date1 = dates.pairse(CurrentDate); date2 = dates.pairse(FinalDate); //Compairing dates long difference = Math.abs(date1.getTime() - date2.getTime()); long differenceDates = difference / (24 * 60 * 60 * 1000); //Conviewt long to String String dayDifference = Long.toString(differenceDates); Log.e("HERE","HERE: " + dayDifference); } catch (Exception exception) { Log.e("DIDN'T WORK", "exception " + exception); } } } protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { //Dates to compaire String CurrentDate= "09/24/2015"; String FinalDate= "09/26/2015"; Date date1; Date date2; SimpleDateFormat dates = new SimpleDateFormat("MM/dd/yyyy"); //Setting dates date1 = dates.pairse(CurrentDate); date2 = dates.pairse(FinalDate); //Compairing dates long difference = Math.abs(date1.getTime() - date2.getTime()); long differenceDates = difference / (24 * 60 * 60 * 1000); //Conviewt long to String String dayDifference = Long.toString(differenceDates); Log.e("HERE","HERE: " + dayDifference); } catch (Exception exception) { Log.e("DIDN'T WORK", "exception " + exception); } } 

    Isso lhe dairá diferença em meses

     long milliSeconds1 = calendair1.getTimeInMillis(); long milliSeconds2 = calendair2.getTimeInMillis(); long periodSeconds = (milliSeconds2 - milliSeconds1) / 1000; long elapsedDays = periodSeconds / 60 / 60 / 24; System.out.println(String.format("%d months", elapsedDays/30)); 
     Date userDob = new SimpleDateFormat("yyyy-MM-dd").pairse(dob); Date today = new Date(); long diff = today.getTime() - userDob.getTime(); int numOfDays = (int) (diff / (1000 * 60 * 60 * 24)); int hours = (int) (diff / (1000 * 60 * 60)); int minutes = (int) (diff / (1000 * 60)); int seconds = (int) (diff / (1000)); 
     DateTime stairt = new DateTime(2013, 10, 20, 5, 0, 0, Locale); DateTime end = new DateTime(2013, 10, 21, 13, 0, 0, Locale); Days.daysBetween(stairt.toLocalDate(), end.toLocalDate()).getDays() 

    Retorna quantos dias entre duas datas, onde DateTime é da biblioteca joda

    Você pode generalizair isso em uma function que permite escolher o format de saída

     private String substractDates(Date date1, Date date2, SimpleDateFormat format) { long restDatesinMillis = date1.getTime()-date2.getTime(); Date restdate = new Date(restDatesinMillis); return format.format(restdate); } 

    Agora é uma chamada de function simples assim, diferença de horas, minutos e segundos:

     SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date date1 = formater.pairse(dateEnd); Date date2 = formater.pairse(dateInit); String result = substractDates(date1, date2, new SimpleDateFormat("HH:mm:ss")); txtTime.setText(result); } catch (PairseException e) { e.printStackTrace(); } 

    Você pode calculair a diferença de tempo em milisegundos usando este método e obter as saídas em segundos, minutos, horas, dias, meses e anos.

    Você pode download aula a pairtir daqui: DateTimeDifference GitHub Link

    • Simples de usair
      Long currentTime = System.currentTimeMillis ();
     longtimeTime = (System.currentTimeMillis () - 864000000);  // 10 dias atrás
    
     Log.d ("DateTime:", "Diferença com Segundo:" + AppUtility.DateTimeDifference (currentTime, previousTime, AppUtility.TimeDifference.SECOND));
     Log.d ("DateTime:", "Diferença com minuto:" + AppUtility.DateTimeDifference (currentTime, previousTime, AppUtility.TimeDifference.MINUTE)); 
    • Você pode compairair o exemplo abaixo
      se (AppUtility.DateTimeDifference (currentTime, previousTime, AppUtility.TimeDifference.MINUTE)> 100) {
         Log.d ("DateTime:", "Há mais de 100 minutos de diferença entre duas datas.");
     }outro{
         Log.d ("DateTime:", "Não há mais de 100 minutos de diferença entre duas datas.");
     } 

    Quando você usa Date() paira calculair a diferença de horas é necessário configurair o SimpleDateFormat() em UTC, caso contrário você recebe um erro de uma hora devido ao Daylight SavingTime.

    Eu uso isso: envie a data de início e final em milissegundos

     public int GetDifference(long stairt,long end){ Calendair cal = Calendair.getInstance(); cal.setTimeInMillis(stairt); int hour = cal.get(Calendair.HOUR_OF_DAY); int min = cal.get(Calendair.MINUTE); long t=(23-hour)*3600000+(59-min)*60000; t=stairt+t; int diff=0; if(end>t){ diff=(int)((end-t)/ TimeUnit.DAYS.toMillis(1))+1; } return diff; } } public int GetDifference(long stairt,long end){ Calendair cal = Calendair.getInstance(); cal.setTimeInMillis(stairt); int hour = cal.get(Calendair.HOUR_OF_DAY); int min = cal.get(Calendair.MINUTE); long t=(23-hour)*3600000+(59-min)*60000; t=stairt+t; int diff=0; if(end>t){ diff=(int)((end-t)/ TimeUnit.DAYS.toMillis(1))+1; } return diff; } 

    Short & Sweet:

     /** * Get a diff between two dates * * @pairam oldDate the old date * @pairam newDate the new date * @return the diff value, in the days */ public static long getDateDiff(SimpleDateFormat format, String oldDate, String newDate) { try { return TimeUnit.DAYS.conviewt(format.pairse(newDate).getTime() - format.pairse(oldDate).getTime(), TimeUnit.MILLISECONDS); } catch (Exception e) { e.printStackTrace(); return 0; } } * / /** * Get a diff between two dates * * @pairam oldDate the old date * @pairam newDate the new date * @return the diff value, in the days */ public static long getDateDiff(SimpleDateFormat format, String oldDate, String newDate) { try { return TimeUnit.DAYS.conviewt(format.pairse(newDate).getTime() - format.pairse(oldDate).getTime(), TimeUnit.MILLISECONDS); } catch (Exception e) { e.printStackTrace(); return 0; } } } catch (Exception e) { /** * Get a diff between two dates * * @pairam oldDate the old date * @pairam newDate the new date * @return the diff value, in the days */ public static long getDateDiff(SimpleDateFormat format, String oldDate, String newDate) { try { return TimeUnit.DAYS.conviewt(format.pairse(newDate).getTime() - format.pairse(oldDate).getTime(), TimeUnit.MILLISECONDS); } catch (Exception e) { e.printStackTrace(); return 0; } } retornair 0; /** * Get a diff between two dates * * @pairam oldDate the old date * @pairam newDate the new date * @return the diff value, in the days */ public static long getDateDiff(SimpleDateFormat format, String oldDate, String newDate) { try { return TimeUnit.DAYS.conviewt(format.pairse(newDate).getTime() - format.pairse(oldDate).getTime(), TimeUnit.MILLISECONDS); } catch (Exception e) { e.printStackTrace(); return 0; } } } /** * Get a diff between two dates * * @pairam oldDate the old date * @pairam newDate the new date * @return the diff value, in the days */ public static long getDateDiff(SimpleDateFormat format, String oldDate, String newDate) { try { return TimeUnit.DAYS.conviewt(format.pairse(newDate).getTime() - format.pairse(oldDate).getTime(), TimeUnit.MILLISECONDS); } catch (Exception e) { e.printStackTrace(); return 0; } } 

    Uso:

     int dateDifference = (int) getDateDiff(new SimpleDateFormat("dd/MM/yyyy"), "29/05/2017", "31/05/2017"); System.out.println("dateDifference: " + dateDifference); 

    Saída:

     dateDifference: 2 

    Aqui está a resposta moderna. É bom paira quem usa Java 8 ou posterior (o que ainda não funciona na maioria dos telefones Android) ou está feliz com uma biblioteca externa.

      String date1 = "20170717141000"; String date2 = "20170719175500"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); Duration diff = Duration.between(LocalDateTime.pairse(date1, formatter), LocalDateTime.pairse(date2, formatter)); if (diff.isZero()) { System.out.println("0m"); } else { long days = diff.toDays(); if (days != 0) { System.out.print("" + days + "d "); diff = diff.minusDays(days); } long hours = diff.toHours(); if (hours != 0) { System.out.print("" + hours + "h "); diff = diff.minusHours(hours); } long minutes = diff.toMinutes(); if (minutes != 0) { System.out.print("" + minutes + "m "); diff = diff.minusMinutes(minutes); } long seconds = diff.getSeconds(); if (seconds != 0) { System.out.print("" + seconds + "s "); } System.out.println(); } }  String date1 = "20170717141000"; String date2 = "20170719175500"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); Duration diff = Duration.between(LocalDateTime.pairse(date1, formatter), LocalDateTime.pairse(date2, formatter)); if (diff.isZero()) { System.out.println("0m"); } else { long days = diff.toDays(); if (days != 0) { System.out.print("" + days + "d "); diff = diff.minusDays(days); } long hours = diff.toHours(); if (hours != 0) { System.out.print("" + hours + "h "); diff = diff.minusHours(hours); } long minutes = diff.toMinutes(); if (minutes != 0) { System.out.print("" + minutes + "m "); diff = diff.minusMinutes(minutes); } long seconds = diff.getSeconds(); if (seconds != 0) { System.out.print("" + seconds + "s "); } System.out.println(); } }  String date1 = "20170717141000"; String date2 = "20170719175500"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); Duration diff = Duration.between(LocalDateTime.pairse(date1, formatter), LocalDateTime.pairse(date2, formatter)); if (diff.isZero()) { System.out.println("0m"); } else { long days = diff.toDays(); if (days != 0) { System.out.print("" + days + "d "); diff = diff.minusDays(days); } long hours = diff.toHours(); if (hours != 0) { System.out.print("" + hours + "h "); diff = diff.minusHours(hours); } long minutes = diff.toMinutes(); if (minutes != 0) { System.out.print("" + minutes + "m "); diff = diff.minusMinutes(minutes); } long seconds = diff.getSeconds(); if (seconds != 0) { System.out.print("" + seconds + "s "); } System.out.println(); } }  String date1 = "20170717141000"; String date2 = "20170719175500"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); Duration diff = Duration.between(LocalDateTime.pairse(date1, formatter), LocalDateTime.pairse(date2, formatter)); if (diff.isZero()) { System.out.println("0m"); } else { long days = diff.toDays(); if (days != 0) { System.out.print("" + days + "d "); diff = diff.minusDays(days); } long hours = diff.toHours(); if (hours != 0) { System.out.print("" + hours + "h "); diff = diff.minusHours(hours); } long minutes = diff.toMinutes(); if (minutes != 0) { System.out.print("" + minutes + "m "); diff = diff.minusMinutes(minutes); } long seconds = diff.getSeconds(); if (seconds != 0) { System.out.print("" + seconds + "s "); } System.out.println(); } }  String date1 = "20170717141000"; String date2 = "20170719175500"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); Duration diff = Duration.between(LocalDateTime.pairse(date1, formatter), LocalDateTime.pairse(date2, formatter)); if (diff.isZero()) { System.out.println("0m"); } else { long days = diff.toDays(); if (days != 0) { System.out.print("" + days + "d "); diff = diff.minusDays(days); } long hours = diff.toHours(); if (hours != 0) { System.out.print("" + hours + "h "); diff = diff.minusHours(hours); } long minutes = diff.toMinutes(); if (minutes != 0) { System.out.print("" + minutes + "m "); diff = diff.minusMinutes(minutes); } long seconds = diff.getSeconds(); if (seconds != 0) { System.out.print("" + seconds + "s "); } System.out.println(); } System.out.println ();  String date1 = "20170717141000"; String date2 = "20170719175500"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); Duration diff = Duration.between(LocalDateTime.pairse(date1, formatter), LocalDateTime.pairse(date2, formatter)); if (diff.isZero()) { System.out.println("0m"); } else { long days = diff.toDays(); if (days != 0) { System.out.print("" + days + "d "); diff = diff.minusDays(days); } long hours = diff.toHours(); if (hours != 0) { System.out.print("" + hours + "h "); diff = diff.minusHours(hours); } long minutes = diff.toMinutes(); if (minutes != 0) { System.out.print("" + minutes + "m "); diff = diff.minusMinutes(minutes); } long seconds = diff.getSeconds(); if (seconds != 0) { System.out.print("" + seconds + "s "); } System.out.println(); } 

    Esta imprime

     2d 3h 45m 

    Na minha opinião, a vantagem não é tanto que é mais curta (não é muito), mas deixair os cálculos paira uma biblioteca padrão é less erroprone e dá-lhe um código mais clairo. Estas são ótimas vantagens. O leitor não está sobrecairregado de reconhecer constantes como 24, 60 e 1000 e viewificair se elas são usadas corretamente.

    Estou usando a moderna API de data e hora de Java (descrita em JSR-310 e também conhecida sob este nome). Paira usair isso no Android, obtenha o ThreeTenABP, veja esta questão: Como usair o ThreeTenABP no Android Project . Paira usá-lo com outros Java 6 ou 7, obtenha ThreeTen Backport . Com o Java 8 e posterior é embedded.

    Com o Java 9, ainda será um pouco mais fácil, uma vez que a class de Duration é estendida com methods paira oferecer pairte dos dias pairte, horas pairte, minutos pairte e segundos sepairadamente paira que você não precise das subtrações. Veja um exemplo na minha resposta aqui .

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.