Java 8 DateTime chaîne de date d'analyse syntaxique de l'API lorsque les deux motifs et la valeur ne sont pas connus

BenW:

J'ai besoin pour analyser une chaîne de temps de date inconnue en utilisant un format de date heure inconnue , mais aussi fourni. Je veux analyser à un ZonedDateTime. S'il n'y a pas de zone contenue dans la chaîne de modèle, je veux prendre fuseau horaire UTC. Le problème est, je ne suis pas sûr de savoir comment déterminer si la chaîne de modèle contient des informations de fuseau horaire afin que je puisse ajouter .withZone(ZoneOffset.UTC)quand je crée le DateTimeFormatter. Comment cela se fait?

String dateTimeFormat = "yyyy-MM-dd HH:mm:ss Z"; // this will be unknown (could be any possible valid pattern)
String dateTimeValue = "2001-01-01 00:00:00 -0800"; // this will also be unknown

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateTimeFormat);
if(????) { // how to determine if the pattern contains timezone information
    dateTimeFormatter = dateTimeFormatter.withZone(ZoneOffset.UTC);
}

ZonedDateTime dateTime = ZonedDateTime.parse(dateTimeValue, dateTimeFormatter);
Basil Bourque:

Votre exemple modèle de formatage ne correspond pas à la DateTimeFormatterclasse. Par exemple majuscule YYYYsignifie une année en fonction semaine, peu probable l'intention de l'expéditeur. Les DDmoyens de jour-année (1-366), encore une fois peu probable l'intention de l'expéditeur.

DateTimeFormatter codes de formatage

Vous aurez besoin d'apprendre les codes étant passés à vous dans ces chaînes. Ensuite , vous devrez traduire au bon formatage des codes de motif utilisés par la DateTimeFormatterclasse.

DateTimeFormatterBuilder

Vous bénéficierez probablement d'utiliser la très flexible et puissante DateTimeFormatterBuilderclasse où vous pouvez construire un format par plusieurs appels. Après tous les appels nécessaires, vous enfin générer un DateTimeFormatteren appelant DateTimeFormatterBuilder::toFormatter.

Recherche Stack Overflow pour des exemples utilisant cette classe.

Autres issues

comment déterminer si la chaîne de modèle contient des informations fuseau horaire

Le Zdans le formatage du code passé vous dit.

Je peux ajouter .withZone (ZoneOffset.UTC)

Si vous essayez de régler à UTC, faire après avoir analysé la chaîne d'entrée dans un objet DateTime. Pour se rendre à UTC, simplement appeler toInstant, comme Instantest toujours en UTC, par définition.

Je ne suis pas adapter à UTC, je veux mettre la zone en UTC s'il n'y a pas de zone spécifiée dans le motif.

Si votre chaîne d'entrée n'a pas un indicateur de fuseau horaire ou offset de-UTC, puis analyser comme LocalDateTime. Cette classe n'a pas volontairement toute notion de fuseau horaire ou offset de-UTC. En tant que tel, un LocalDateTimene pas représenter un moment, est pas un point sur la timeline.

Si vous connaissez pour certains la chaîne sans zone / offset a en effet été effectivement destiné à une zone particulière / offset, puis:

Avec un OffsetDateTimeou ZonedDateTime, vous avez maintenant un moment, un moment.

Quelle est la différence entre la zone et le décalage? Un décalage est simplement un certain nombre d'heures-minutes-secondes, rien de plus. Une zone, en revanche, est beaucoup plus. Une zone est une histoire du passé, du présent, et les modifications futures du décalage utilisé par la population d'une région donnée.

LocalDateTime ldt = LocalDateTime.parse( "2018-01-23T01:23:45.123" ) ;  // *Not* a moment, *not* a point on the timeline.
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ; // Assign an offset to determine a moment.

Vous semblez être trop concentré sur l' analyse comme un moyen d'appliquer votre logique métier. Au lieu de cela, faire votre analyse aussi simple que possible et directe pour obtenir un objet correspondant à l'entrée java.time. Seulement après l' analyse syntaxique si vous apporterons des ajustements ou des transformations de votre valeur date-heure. Séparer enfin les deux ce parsing et le code transformation de vos autres travaux de logique métier, vous avez trois phases distinctes: (1) simplement / directement Parse, (2) ajuster / transformer la valeur, (3) utiliser la valeur à temps la date à des fins commerciales.

ISO 8601

Ce projet de la vôtre est pleine de risques. Prendre la responsabilité de quelqu'un d'autre est des entrées de chaînes arbitraires avec leur propre inventé les codes de formatage est quelque chose que je voudrais simplement refuser de le faire. Le succès ou l'échec est hors de votre contrôle, comme vous ne pouvez jamais savoir complètement ce qui arrivera.

L'approche plus sage est de transférer la charge à la source de ces données entrant. Ils devraient PASSERA vos chaînes dans la norme ISO 8601 format. Cette norme a été conçu précisément pour cette fin, l' échange des valeurs date-heure sous forme de texte. Les formats standards sont intelligemment conçus pour être sans ambiguïté, et facile à analyser par machine, ainsi que facile à lire par les humains à travers les cultures.

Les java.time classes utilisent les formats standard ISO 8601 par défaut lors de l' analyse / génération de chaînes. La ZonedDateTimeclasse étend judicieusement la norme en ajoutant le nom de fuseau horaire entre crochets. Je vous conseille la source de vos données à faire de même si l' envoi d' une valeur zoné - généralement préférable d'échanger que des valeurs UTC.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=205375&siteId=1
conseillé
Classement