Obtenir millisecondes jusqu'à minuit
Je suis de la création d'un widget Android que je veux mettre à jour tous les soirs à minuit. Je suis en utilisant un AlarmManager
et j'ai besoin de savoir le nombre de millisecondes qui sont à gauche de l'heure actuelle jusqu'à minuit. Voici mon code:
AlarmManager mAlarmManager = (AlarmManager)context.getSystemService(android.content.Context.ALARM_SERVICE);
mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, millisecondsUntilMidnight, mSrvcPendingingIntent);
Comment puis-je calculer le nombre de millisecondes sont à gauche jusqu'à minuit?
Vous en remercie d'avance.
- Cela peut vous aider, il suffit de retourner dans votre cas, stackoverflow.com/questions/4389500/...
Vous devez vous connecter pour publier un commentaire.
Utiliser un Calendrier pour le calculer :
Calendar.getInstance()
est d'ores et déjà la date du jour&temps, de sortec.setTime(now)
est inutile. Vous pouvez également utiliserSystem.currentTimeMillis()
pour comparer avec votre calendrier de valeurtl;dr
java.temps
Java 8 et, plus tard, avec la java.le temps cadre intégré. Ces nouvelles classes supplanter l'ancienne date-heure classes (java.util.Date/.Calendrier) livré avec Java. Aussi supplante Joda-Time, développé par les mêmes personnes. Une grande partie de la java.fonction temps est de retour, porté à Java 6 & 7, et plus adapté à Android (voir ci-dessous).
Un fuseau horaire est crucial dans la détermination d'une date. Pour un moment donné, la date varie à travers le monde par zone. Par exemple, quelques minutes après minuit dans Paris, France est un nouveau jour, alors encore “hier” dans Montréal, Québec.
Spécifier un fuseau horaire nom dans le format de
continent/region
, commeAmerica/Montreal
,Africa/Casablanca
, ouPacific/Auckland
. Ne jamais utiliser de l'3-4 abréviation commeEST
ouIST
comme ils sont pas vrai fuseaux horaires, pas normalisée, et même pas unique(!).Nous voulons obtenir le nombre de millisecondes en cours d'exécution jusqu'à, mais ne comprenant pas, le premier moment de la journée suivante.
On doit passer par les
LocalDate
classe pour obtenir dans le premier moment de la journée. Donc, ici, nous commençons avec unZonedDateTime
pour obtenir unLocalDate
, et après que d'en faire un autreZonedDateTime
. La clé est d'appeleratStartOfDay
sur leLocalDate
.Avis que nous n'avons pas coder en dur une heure de la journée à 00:00:00. En raison d'anomalies telles que l'Heure d'été (DST), la journée ne peut commencer à un autre moment comme 01:00:00. Laissez java.le temps de déterminer le premier moment.
Maintenant, nous pouvons calculer le temps écoulé. En java.fois que nous utilisons le
Durée
classe. La java.cadre de temps a une résolution plus fine de nanosecondes plutôt que de la plus grossière millisecondes utilisé par java.util.Date et Joda-Time. MaisDuration
comprend une pratiquegetMillis
méthode, comme la Question demandée.Voir ce code à exécuter en direct à IdeOne.com.
Sur java.temps
La java.temps cadre est intégré dans Java 8 et les versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date du temps des classes comme
java.util.Date
,Agenda
, &SimpleDateFormat
.La Joda-Time projet, maintenant dans le mode de maintenance, conseille la migration vers le java.le temps classes.
Pour en savoir plus, consultez les Oracle Tutoriel. Et de recherche de Débordement de Pile pour de nombreux exemples et des explications. La spécification est JSR 310.
Vous pouvez échanger java.temps objets directement avec votre base de données. Utiliser un Pilote JDBC compatible avec JDBC 4.2 ou plus tard. Pas besoin de chaînes, pas besoin de
java.sql.*
classes.Où obtenir le java.les classes de temps?
Joda-Time
Mise à JOUR: La Joda-Time projet est maintenant dans le mode de maintenance, avec l'équipe conseiller de la migration vers le java.le temps classes. Je laisse cette section intacte pour le bien de l'histoire, mais de recommander à l'aide de java.temps et ThreeTenABP comme discuté ci-dessus.
Dans Android, vous devriez être en utilisant la Joda-Time de la bibliothèque plutôt que de le notoirement gênants Java.util.Date/.Calendrier des classes.
Joda-Time offre une millisecondes de la journée à la commande. Mais nous n'avons pas vraiment besoin de ça ici.
Au lieu de cela nous avons juste besoin d'un
Durée
objet pour représenter le laps de temps jusqu'à ce premier moment de la journée suivante.Fuseau horaire est ici essentielle pour déterminer quand "demain" commence. Généralement préférable de spécifier que reposent implicitement sur la JVM par défaut en cours de fuseau horaire qui peut changer à tout moment. Ou si vous voulez vraiment la JVM par défaut, demander explicitement avec appel à la
DateTimeZone.getDefault
pour faire de votre code d'auto-documentation.Pourrait être un deux-liner.
Prenons qu'en dehors.
De vidage de la console.
Lors de l'exécuter.
Essayez ce qui suit:
Serait-ce de travailler?
Vous pouvez utiliser
AlarmManager.RTC
au lieu deAlarmManager.ELAPSED_REALTIME
, et il suffit de mettre un Calendrier pour le temps que vous voulez :À l'aide de la manière suivante, il n'y a pas besoin de s'inquiéter à propos de la configuration DAY_OF_MONTH.