Le meilleur moyen d'extraire le Fuseau horaire de l'objet à partir d'une Chaîne?
J'ai un champ de base de données qui contient les raw d'un champ de date (stockées en tant que données de caractères), comme
Vendredi, septembre 26, 2008 8:30 PM Heure Avancée de l'est
Je peut analyser ce qu'une Date facilement, avec SimpleDateFormat
DateFormat dbFormatter = new SimpleDateFormat("EEEE, MMMM dd, yyyy hh:mm aa zzzz");
Date scheduledDate = dbFormatter.parse(rawDate);
Ce que je voudrais faire est d'extraire un Fuseau horaire de l'objet de cette chaîne. Le Fuseau horaire par défaut dans la JVM que cette application s'exécute en est GMT, donc je ne peux pas utiliser .getTimezoneOffset()
de la Date
analysée ci-dessus (parce qu'il sera de retour le Fuseau horaire par défaut).
En plus de la segmentation de la chaîne brute et de trouver la position de départ de la chaîne Timezone (car je sais que le format sera toujours EEEE, MMMM dd, yyyy hh:mm aa zzzz
) est-il un moyen à l'aide de la DateFormat/SimpleDateFormat/Date/Calendrier de l'API pour extraire un Fuseau horaire de l'objet qui a le même Fuseau horaire que la Chaîne de caractères que j'ai analysé à part avec DateFormat.parse()
?
Une chose qui me dérange à propos de Date
vs Calendar
dans l'API Java est que Calendar
est censé remplacer Date
dans tous les endroits... mais ensuite, ils ont décidé, oh, hey nous allons encore utiliser Date
's dans la DateFormat
classes.
Concernant le dernier paragraphe, le
Date
& Calendar
classes sont un désordre sanglant: mal conçue, de la confusion, et gênants. Les éviter. Utiliser le java.de temps les classes à la place.OriginalL'auteur matt b | 2008-09-17
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé que les suivantes:
Produit est le suivant:
En fait je trouve cela un peu surprenant. Mais, je pense que cela montre que la réponse à votre question est de simplement appeler getTimeZone sur le formateur après que vous avez analysé.
Edit:
Le ci-dessus a été exécuté avec Sun JDK 1.6.
Juste curieux - qu'est-ce que le résultat de Fuseau horaire.getDefault() sur votre machine?
OriginalL'auteur Ed Thomas
@Ed Thomas:
J'ai essayé quelque chose de très similaire à votre exemple, et j'obtiens des résultats très différents:
De sortie:
Semble
DateFormat.getTimeZone()
renvoie le même Fuseau horaire avant et après laparse()
... même si je jette explicitesetTimeZone()
avant d'appelerparse()
.Regardant le source pour DateFormat et SimpleDateFormat, semble
getTimeZone()
retourne le Fuseau horaire de la sous-jacentes Calendrier... qui sera, par défaut, le Calendrier de la Locale par défaut/Fuseau horaire, sauf si vous spécifiez un certain.java version "1.4.2_14" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_14-b05) Java HotSpot(TM) Client VM (build 1.4.2_14-b05, en mode mixte)
OriginalL'auteur matt b
Je vous recommandons de vérifier la Joda Time date et l'heure de l'API. J'ai récemment été converti en croyant en elle comme il a tendance à être très supérieure à la prise en charge intégrée pour les dates et les heures dans Java. En particulier, vous devriez vérifier le DateTimeZone classe. Espérons que cette aide.
http://joda-time.sourceforge.net/
http://joda-time.sourceforge.net/api-release/index.html
OriginalL'auteur Aaron
tl;dr
java.temps
La façon moderne est à la java.les classes de temps. La Question et d'autres Réponses utilisez le gênants ancien héritage de date-heure de classes ou de la Joda-Time, qui sont aujourd'hui supplanté par le java.les classes de temps.
Définir un
DateTimeFormatter
objet avec un modèle de mise en forme pour correspondre à vos données.Attribuer un
Locale
pour spécifier le langage humain du nom-du-jour et le nom du mois, ainsi que les normes culturelles pour les autres questions de mise en forme.Enfin, faire l'analyse pour obtenir une
ZonedDateTime
objet.Vous pouvez demander le fuseau horaire à partir de la
ZonedDateTime
, représenté comme unZoneId
objet. Vous pouvez ensuite interroger leZoneId
si vous avez besoin de plus d'infos sur le fuseau horaire.Voyez par vous-même dans IdeOne.com.
ISO 8601
Éviter l'échange de données date-heure dans ce genre de terrible format. Ne présumez pas l'anglais, ne pas accessoiriser votre tenue de sortie avec des choses comme le nom de la journée, et ne jamais utiliser de pseudo-temps-zones comme
Eastern Daylight Time
.Pour les fuseaux horaires: Spécifiez 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 ne sont pas vrais fuseaux horaires, pas normalisée, et même pas unique(!).Pour la sérialisation de date-heure de valeurs de texte, utilisez uniquement le ISO 8601 formats. La java.les classes de temps l'utilisation de ces formats par défaut lors de l'analyse/génération de chaînes de caractères pour représenter leur valeur.
Sur java.temps
La java.le 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 java.temps.
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.
Où obtenir le java.les classes de temps?
La ThreeTen-Extra projet s'étend java.temps avec d'autres classes. Ce projet est un terrain d'essai pour de possibles futurs ajouts à java.temps. Vous pouvez trouver quelques classes utiles ici comme
Intervalle
,YearWeek
,YearQuarter
, et plus.OriginalL'auteur Basil Bourque
Ainsi que d'une solution partielle vous pouvez utiliser une RegEx match pour obtenir le fuseau horaire puisque vous aurez toujours le même texte. AM ou PM.
Je ne sais pas assez sur Java fuseaux horaires pour vous la dernière partie.
OriginalL'auteur Mitchel Sellers
La principale différence entre la Date et le Calendrier, cette Date est juste un objet de valeur avec pas de méthode permettant de le modifier. Il est conçu pour stocker une date/heure de l'information quelque part. Si vous utilisez un Calendrier de l'objet, vous pouvez modifier une fois qu'il est réglé à une persistance de l'entité qui effectue une logique d'entreprise avec les informations de date/heure. C'est très dangereux, parce que l'entité n'a aucun moyen de reconnaître ce changement.
Le Calendrier des cours est conçu pour les opérations sur date/heure, comme l'ajout de jours ou quelque chose comme ça.
Jouer avec votre exemple, je reçois le texte suivant:
De sortie:
Est-ce le résultat que vous vouliez?
OriginalL'auteur Roland Schneider
Ed a droit. vous voulez le fuseau horaire sur le DateFormat objet après le temps a été analysée.
produit
OriginalL'auteur Mike Pone