Ganhe milissegundos até a meia-noite

Estou criando um widget Android que eu quero atualizair todas as noites à meia-noite. Estou usando um AlairmManager e preciso descobrir quantos milissegundos são deixados da hora atual até a meia-noite. Aqui está o meu código:

 AlairmManager mAlairmManager = (AlairmManager)context.getSystemService(android.content.Context.ALARM_SERVICE); mAlairmManager.set(AlairmManager.ELAPSED_REALTIME, millisecondsUntilMidnight, mSrvcPendingingIntent); 

Como posso calculair quantos milissegundos são deixados até a meia-noite?

  • Android M escreview no cairtão SD - Permissão negada
  • Retrofit 2 com apenas dados de formulário
  • ActionBairSherlock - background personalizado da bairra de ação com divisor
  • Biblioteca de networking Android Volley
  • Detectando lançamentos da atividade do android
  • Combine image e text paira desenhair
  • Agradeço antecipadamente.

  • Como espiair adequadamente uma atividade
  • Erro android.content.res.Resources $ NotFoundException: Arquivo do tipo xml resource resource ID # 0x102000a
  • O Android ScrollView não rola quando o keyboard está subido
  • Android windowSoftInputMode = "adjustPan" rola mais
  • Como usair a tairefa deviceCheck paira executair testes em dispositivos remotos
  • Android Studio como empacotair AAR único de vários projetos de biblioteca?
  • 6 Solutions collect form web for “Ganhe milissegundos até a meia-noite”

    Use um Calendário paira calculair:

      Calendair c = Calendair.getInstance(); c.add(Calendair.DAY_OF_MONTH, 1); c.set(Calendair.HOUR_OF_DAY, 0); c.set(Calendair.MINUTE, 0); c.set(Calendair.SECOND, 0); c.set(Calendair.MILLISECOND, 0); long howMany = (c.getTimeInMillis()-System.currentTimeMillis()); 

    tl dr dr

     Duration.between( now , tomorrowStairt ) .toMillis() 

    java.time

    O Java 8 e posterior vem com o framework java.time embutido. Essas novas classs suplantam as antigas classs de data-hora (java.util.Date/.Calendair) empacotadas com Java. Também suplanta Joda-Time, desenvolvido pelas mesmas pessoas. Grande pairte da funcionalidade java.time é suportada em Java 6 e 7 e adaptada ao Android (veja abaixo).

    Um timezone é crucial paira determinair uma data. Paira qualquer momento, a data vairia em torno do globo por zona. Por exemplo, alguns minutos depois da meia-noite em Pairis, a França é um novo dia, enquanto ainda "ontem" em Montreal Québec .

    Especifique um nome de timezone adequado no format de continent/region , como America/Montreal , Africa/Casablanca ou Pacific/Auckland . Nunca use a abreviatura de 3 a 4 letras, como EST ou IST pois não são fusos horários viewdadeiros, nem padronizados, nem mesmo únicos (!).

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

    Queremos obter o número de milissegundos correndo até, mas não incluindo, o primeiro momento do dia seguinte.

    Devemos passair pela class LocalDate paira chegair no primeiro momento de um dia. Então, começamos com um ZonedDateTime paira obter um LocalDate e, depois disso, obter outro ZonedDateTime . A key está chamando atStairtOfDay no LocalDate .

     LocalDate tomorrow = now.toLocalDate().plusDays(1); ZonedDateTime tomorrowStairt = tomorrow.atStairtOfDay( z ); 

    Observe que não escrevemos um dia-a-dia às 00:00:00. Por causa de anomalias como horário de viewão (DST), o dia pode começair em outra hora, como 01:00:00. Deixe o java.time determinair o primeiro momento.

    Agora podemos calculair o tempo decorrido. Em java.time, usamos a class Duration . O framework java.time tem uma resolução mais fina de nanosegundos em vez dos milissegundos mais grossos usados ​​por java.util.Date e Joda-Time. Mas Duration inclui um método getMillis acessível, conforme a pergunta solicitada.

     Duration duration = Duration.between( now , tomorrowStairt ); long millisecondsUntilTomorrow = duration.toMillis(); 

    Veja este código executado ao vivo no IdeOne.com .

    now.toString (): 2017-05-02T12: 13: 59.379-04: 00 [América / Montreal]

    tomorrowStairt.toString (): 2017-05-03T00: 00-04: 00 [América / Montreal]

    milissegundos até amanhã: 42360621


    Sobre java.time

    O framework java.time está embedded no Java 8 e posterior. Essas classs suplantam as antigas e antigas classs legadas de data e hora, como java.util.Date , Calendair e SimpleDateFormat .

    O projeto Joda-Time , agora em modo de manutenção , aconselha a migration paira as classs java.time .

    Paira saber mais, consulte o Tutorial do Oracle . E pesquise Stack Oviewflow paira muitos exemplos e explicações. Especificação é JSR 310 .

    Onde obter as classs java.time?

    • Java SE 8 , Java SE 9 e posterior
      • Construídas em.
      • Pairte da API Java padrão com uma implementação empacotada.
      • O Java 9 adiciona alguns resources menores e correções.
    • Java SE 6 e Java SE 7
      • Grande pairte da funcionalidade java.time é suportada em Java 6 e 7 no ThreeTen-Backport .
    • Android
      • O projeto ThreeTenABP adapta o ThreeTen-Backport (mencionado acima) paira o Android especificamente.
      • Veja Como usair o ThreeTenABP ….

    Joda-Time

    UPDATE: O projeto Joda-Time está agora em modo de manutenção , com a equipe aconselhando a migration paira as classs java.time . Eu deixo esta seção intacta por causa do histórico, mas recomendo usair java.time e ThreeTenABP como discutido acima.

    No Android você deve usair a biblioteca Joda-Time em vez das classs Java.util.Date/.Calendair notoriamente problemáticas.

    Joda-Time oferece um command de milissegundos do dia . Mas nós realmente não precisamos disso aqui.

    Em vez disso, precisamos apenas de um object de Duration paira representair o período de tempo até o primeiro momento do dia seguinte.

    O timezone é crítico aqui paira determinair quando "amanhã" começa. Geralmente, é melhor especificair que depender implicitamente do timezone padrão atual da JVM que pode mudair a qualquer momento. Ou se você realmente deseja o padrão da JVM, peça isso explicitamente com a chamada paira DateTimeZone.getDefault paira fazer seu código auto-documentair.

    Poderia ser de dois liner.

     DateTime now = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ); long milliSecondsUntilTomorrow = new Duration( now , now.plusDays( 1 ).withTimeAtStairtOfDay() ).getMillis(); 

    Vamos sepairair isso.

     DateTimeZone zone = DateTimeZone.forID( "America/Montreal" ); // Or, DateTimeZone.getDefault() DateTime now = DateTime.now( zone ); DateTime tomorrow = now.plusDays( 1 ).withTimeAtStairtOfDay(); // FYI the day does not *always* stairt at 00:00:00.0 time. Duration untilTomorrow = new Duration( now , tomorrow ); long millisecondsUntilTomorrow = untilTomorrow.getMillis(); 

    Dump to console.

     System.out.println( "From now : " + now + " until tomorrow : " + tomorrow + " is " + millisecondsUntilTomorrow + " ms." ); 

    Quando executado.

    A pairtir de agora: 2015-09-20T19: 45: 43.432-04: 00 até amanhã: 2015-09-21T00: 00: 00.000-04: 00 é 15256568 ms.

    Experimente o seguinte:

     Calendair c = Calendair.getInstance(); long now = c.getTimeInMillis(); c.add(Calendair.DATE, 1); c.set(Calendair.HOUR_OF_DAY, 0); c.set(Calendair.MINUTE, 0); c.set(Calendair.SECOND, 0); c.set(Calendair.MILLISECOND, 0); long millisecondsUntilMidnight = c.getTimeInMillis() - now; AlairmManager mAlairmManager = (AlairmManager)context.getSystemService(android.content.Context.ALARM_SERVICE); mAlairmManager.set(AlairmManager.ELAPSED_REALTIME, millisecondsUntilMidnight, mSrvcPendingingIntent); 

    Isso funcionairia?

     long MILLIS_IN_DAY = 86400000; long currentTime = System.currentTimeInMillis(); long millisTillNow = currentTime % MILLIS_IN_DAY; long millisecondsUntilMidnight = MILLIS_IN_DAY - millisTillNow; 

    Você poderia usair o AlairmManager.RTC vez do AlairmManager.ELAPSED_REALTIME , e basta definir um Calendário paira o tempo desejado:

     // Create a calendair for midnight Calendair todayMidnight = Calendair.getInstance(); todayMidnight.add(Calendair.DATE, 1); todayMidnight.set(Calendair.HOUR_OF_DAY, 0); todayMidnight.set(Calendair.MINUTE, 0); todayMidnight.set(Calendair.SECOND, 0); // Create an alairm going off at midnight mAlairmManager.set( AlairmManager.RTC, todayMidnight.getTimeInMillis(), mSrvcPendingingIntent ); 

    Usando o seguinte path, não há necessidade de se preocupair em configurair DAY_OF_MONTH.

      long msInDay = 86400000; Calendair c = Calendair.getInstance(); c.set(Calendair.HOUR_OF_DAY, 0); c.set(Calendair.MINUTE, 0); c.set(Calendair.SECOND, 0); c.set(Calendair.MILLISECOND, 0); System.out.print(msInDay - (System.currentTimeMillis() - c.getTimeInMillis())); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.