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.
Tu travailles trop dur.
Instant.parse( "2017-03-03T13:14:28.666Z" )
.truncatedTo( ChronoUnit.DAYS )
.toString()
2017-03-03T00: 00.00Z
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
.
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 .
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