2017-09-26 6 views
-2

Nous avons reçu l'heure comme heure = 11, minutes = 29, secondes = 54, milliseond = 999 avec les informations de fuseau horaire.Convertir LocalTime pour une zone donnée en unix epoch secondes sans la composante de date en java

Comment convertir cette fois en unix époque millisecondes sans partie de date. J'ai essayé ce code:

ZoneId zoneId = ZoneId.of("America/New_York"); 
    LocalDate now = LocalDate.now(zoneId); 
    long epochMilli = ZonedDateTime.of(LocalDate.now(zoneId).atTime(11, 29, 20, 999 * 1000 * 1000), zoneId).toInstant().toEpochMilli(); 
    long unixEpocSeconds = epochMilli % (24 * 60 * 60 * 1000); //86400000 

    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(zoneId)); 
    calendar.setTimeInMillis(unixEpocSeconds); 
    System.out.println("(= " + (calendar.get(Calendar.HOUR)==11)); 
    System.out.println("(= " + (calendar.get(Calendar.MINUTE)==29)); 
    System.out.println("(= " + (calendar.get(Calendar.SECOND)==20)); 
    System.out.println("(= " + (calendar.get(Calendar.MILLISECOND)==999)); 

Comment obtenir les secondes d'époque sans unix i.e.how composant ce jour pour obtenir les millisecondes dans la zone UTC/plutôt que donner IDZone. Au-dessus du code court trouver si IDZone = UTC

+1

Vous ne pouvez pas. L'unix epoch secondes est * "le nombre de secondes écoulées depuis l'époque unix (qui est' 1970-01-01T00: 00Z') "*. Si vous avez juste le temps et n'avez pas la date, comment pouvez-vous calculer cela? –

+0

Un autre détail: 'toEpochMilli()' renvoie le nombre de ** millisecondes ** depuis unix epoch (pour obtenir les secondes, appelez 'getEpochSecond()' à la place). Et pour construire un 'ZonedDateTime', vous pouvez aussi faire' ZonedDateTime.of (LocalDate.now (zoneId) .atTime (11, 29, 20, 999 * 1000 * 1000), zoneId) '- un peu plus court que d'appeler' getYear() ',' getMonthValue() 'et ainsi de suite. –

+0

@Hugo Merci. Nous ne pouvons pas obtenir l'époque millisecondes sans la date. Est-il possible de faire s'écouler les milises depuis minuit w.r.t UTC? – RGoyal

Répondre

0

tl; dr

Duration.ofHours(11L) 
     .plusMinutes(29L) 
     .plusSeconds(54L) 
     .plusMillis(999L) 
     .toMillis() 

Span-de-temps en fonction du temps de la journée

Votre question est confus . Une heure sans date n'a pas de sens par rapport à l'UTC. Nombre de millisecondes écoulées depuis la date de référence de l'époque Unix 1970-01-01T00:00:00Z pour le suivi de la date et l'heure du jour.

Je suppose que vous êtes en train de faire face à une période de temps, et de ne pas gérer cela comme un moment de la journée. L'un est destiné à la chronologie, l'autre ne l'est pas.

Duration

Les classes java.time avec Java 8 et versions ultérieures comprennent Duration pour le traitement de ces durées de temps non attaché à la ligne de temps. Ces méthodes prennent le type de données long, d'où le L suivant.

Duration d = Duration.ofHours(11L).plusMinutes(29L).plusSeconds(54L).plusMillis(999L) ; 

Nombre de millisecondes

Vous avez demandé un nombre de millisecondes, donc voilà. Méfiez-vous de la perte de données, car Duration comporte une résolution plus fine de quelques nanosecondes, ce qui vous permet d'éliminer une fraction de seconde plus fine lors de la conversion en millisecondes.

long millis = d.toMillis() ; // Converts this duration to the total length in milliseconds. 

Mais je vous suggère de ne pas représenter de temps ni envergures moments sur la timeline en utilisant un décompte de millisecondes. Mieux vaut utiliser des objets ou du texte standardisé; continuer à lire.

ISO 8601

La norme définit les formats ISO 8601 pratiques sans ambiguïté pour représenter les valeurs date-heure sous forme de texte. Ce numéro comprend representation of durations Le format est PnYnMnDTnHnMnS où le P marque le début tandis que le T sépare toute partie années-mois-jours de toute partie heures-minutes-secondes.

Les classes java.time utilisent par défaut les formats standard dans leurs méthodes parse et toString.

String output = d.toString() ; 

PT11H29M54.999S

Voir cette code run live at IdeOne.com.

Vous pouvez directement analyser de telles chaînes dans java.time.

Duration d = Duration.parse("PT11H29M54.999S") ; 

Je suggère d'utiliser ce format lorsque cela est possible, certainement lors de l'échange de données entre les systèmes.

Lorsque vous travaillez à l'intérieur de Java, transmettez les objets Duration plutôt que de simples textes.

Timeline

Vous pouvez réaliser des opérations mathématiques date-heure avec les Duration objets. Par exemple, prenez le moment actuel dans votre fuseau horaire et ajoutez les onze heures et demie.

ZoneId z = ZoneId.of("Pacific/Auckland") ; 
ZonedDateTime now = ZonedDateTime.now(z) ; 
ZonedDateTime later = now.plus(d) ; 

now.toString(): 2017-09-27T07: 23: 31,651 + 13: 00 [Pacific/Auckland]

later.toString(): 2017-09-27T18: 53 : 26,650 + 13: 00 [Pacific/Auckland]

Pour les valeurs UTC, appelez toInstant. La classe Instant représente un moment sur la ligne temporelle en UTC avec une résolution de nanosecondes (plus fine que millisecondes).

Instant instant = later.toInstant() ;