web-dev-qa-db-fra.com

Définissez les heures, les minutes et les secondes sur 00 dans ZonedDateTime ou Instant.

J'ai une chaîne de date au format Utc -

    String dateStr = "2017-03-03T13:14:28.666Z";

Et je veux le convertir au format ci-dessous en représentation de date Java dans ZonedDateTime .

Lorsque ZonedDateTime est imprimé, il devrait afficher 

    String dateStr = "2017-03-03T00:00:00.000Z";

J'ai essayé de suivre le code -

    String timeZone = "America/Los_Angeles";
    DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX");
    DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    ZoneId zoneId1 = ZoneId.of(timeZone);
    String dateStr = "2017-03-03T13:14:28.666Z";
    Instant inst = Instant.parse(dateStr, dtf2);


    ZonedDateTime dateTimeInTz = ZonedDateTime.ofInstant(inst, zoneId1);

    ZonedDateTime startTime = dateTimeInTz.with(LocalTime.of(0, 0, 0, 0));
    ZonedDateTime endTime = dateTimeInTz.with(LocalTime.MAX);

    System.out.println("Start:"+startTime+", End:"+endTime);
    System.out.println("Start:"+startTime.toString()+", End:"+endTime.toString());  

    ZonedDateTime nT = ZonedDateTime.of ( LocalDate.parse(dateStr, dtf1) , LocalTime.of (0,0,0,0) , ZoneId.of ( timeZone ) );

    System.out.println("Start:"+nT);

Sortie:

Start:2017-03-03T00:00-08:00[America/Los_Angeles], End:2017-03-03T23:59:59.999999999-08:00[America/Los_Angeles]
Start:2017-03-03T00:00-08:00[America/Los_Angeles], End:2017-03-03T23:59:59.999999999-08:00[America/Los_Angeles]
Start:2017-03-03T00:00-08:00[America/Los_Angeles]

Je souhaite que l'heure de début soit normalisée dans ZonedDateTime. Je souhaite y parvenir à l'aide de bibliothèques Java uniquement, et non d'une bibliothèque tierce.

6
WitVault

tl; dr

Tu travailles trop dur.

Instant.parse( "2017-03-03T13:14:28.666Z" )
       .truncatedTo( ChronoUnit.DAYS )
       .toString()

2017-03-03T00: 00.00Z

Détails

Que signifie "normalisé dans ZonedDateTime"? Veuillez modifier votre question pour clarifier.

Lorsque ZonedDateTime est imprimé, il devrait afficher… "2017-03-03T00: 00: 00.000Z"

Ce que vous demandez est une contradiction. Une ZonedDateTime a un fuseau horaire attribué pour le moment où vous souhaitez afficher un moment dans une heure donnée. Donc, demander une ZonedDateTime pour générer une chaîne en UTC telle que "2017-03-03T00:00:00.000Z" n'a aucun sens. Z est l'abréviation de Zulu et signifie UTC. 

Votre chaîne de saisie est au format standard ISO 8601. Les classes Java.time utilisent ces formats standard par défaut. Donc, pas besoin de spécifier un modèle de formatage, pas besoin de la classe DateTimeFormatter.

Analyser comme une Instant, un point de la chronologie en UTC avec une résolution en nanosecondes. 

Instant instant = Instant.parse( "2017-03-03T13:14:28.666Z" );

Si vous voulez minuit en UTC, tronquez. 

Instant instantMidnightUtc = instant.truncatedTo( ChronoUnit.DAYS );

instantMidnightUtc.toString (): 2017-03-03T00: 00.00Z

Pas besoin de la classe ZonedDateTime.

Si vous souhaitez travailler avec une date uniquement sans heure et sans fuseau horaire, utilisez la classe LocalDate.

En passant, ne supposez pas que le premier moment de la journée est toujours 00:00:00. Cela est vrai pour UTC. Toutefois, certains fuseaux horaires peuvent comporter des anomalies, telles que l'heure d'été, où le jour peut commencer à une autre heure, par exemple 01:00:00.


À propos de Java.time

La structure Java.time est intégrée à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes legacy telles que Java.util.Date , Calendar , & SimpleDateFormat .

Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes Java.time .

Pour en savoir plus, voir le Oracle Tutorial . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Où obtenir les classes Java.time? 

Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts à Java.time. Vous pouvez y trouver des classes utiles telles que Interval , YearWeek , YearQuarter et more .

17
Basil Bourque
   String timeZone = "America/Los_Angeles";
    DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX");
    DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    ZoneId zoneId1 = ZoneId.of(timeZone);
    String dateStr = "2017-03-03T13:14:28.666Z";
    Instant inst = Instant.parse(dateStr, dtf2);


    ZonedDateTime dateTimeInTz = ZonedDateTime.ofInstant(inst, zoneId1);

    ZonedDateTime startTime = dateTimeInTz.with(LocalTime.of(0, 0, 0, 0));
    ZonedDateTime endTime = dateTimeInTz.with(LocalTime.MAX);

    String strStart = (startTime.toString().split("T"))[0] + "T00:00:00.000Z";
    String strEnd  =  (endTime.toString().split("T"))[0] + "T00:00:00.000Z";

    System.out.println("Start:"+strStart +", End:"+strEnd  );

EDIT nouvelle méthode:

TimeZone timeZone = TimeZone.getTimeZone("Europe/Copenhagen");
Calendar cal = Calendar.getInstance(timeZone);
Calendar defaut = new GregorianCalendar( cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH),0,0,0);

Vous devez juste obtenir tous vos champs nécessaires. Avec, par exemple, un dateFormat.

J'espère que cela vous aidera

0
hartar