2010-06-03 6 views
4

J'utilise le format de date simple pour permettre aux utilisateurs de spécifier le fuseau horaire qu'ils envoient des données dans:Java format simple date du temps britannique

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,z"); 

Cela fonctionne très bien: par exemple

df.parse("2009-05-16 11:07:41,GMT"); 

Cependant, si quelqu'un envoie toujours temps en temps à Londres (à savoir la prise en compte des économies de lumière du jour), quelle serait la zone du temps approriate chaîne à ajouter? par exemple. cela ne fonctionne pas:

df.parse("2009-05-16 11:07:41,Western European Time"); 
System.out.println(date); 
Sat May 16 12:07:41 BST 2009 

Je veux faire correspondre l'heure à l'heure anglaise en prenant l'heure d'été.

Merci.

+0

Avez-vous essayé "BST"? Je crois que cela signifie British Summer Time (équivalent à l'heure d'été américaine). –

+0

est-il correct d'utiliser BST en hiver? –

+0

Juste essayé ... ne fonctionne pas 10h BST en hiver n'est pas la même que 10H London Time. –

Répondre

0

Alors quelle est exactement votre question - quel ID pour le TimeZone vous devriez utiliser? Ce qui suit imprimer une liste de tous les identifiants de fuseau horaire disponibles:

for (String id : TimeZone.getAvailableIDs()) { 
    System.out.println(id); 
} 
+0

n'aide pas .... l'id est sans importance pour l'analyse. –

5

Dans l'heure d'été, il est BST. Dans le reste de l'année, c'est GMT.

Je suggère que vous utilisiez le nom générique (pour l'année entière), qui est Europe/London. Vous pouvez utiliser quelque chose comme ceci:

String userInput = "2009-05-16 11:07:41,Europe/London"; 
    String[] tokens = userInput.split(","); 

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    df.setTimeZone(TimeZone.getTimeZone(tokens[1])); 
    System.out.println(df.parse(tokens[0])); 

La sortie dans ce cas est:

Sat May 16 11:07:41 GMT+01:00 2009 
+0

annule tout le point de laisser l'utilisateur spécifier le fuseau horaire dans la chaîne d'analyse –

+0

@DD - non, ce n'est pas le cas. Vous pouvez toujours laisser l'utilisateur spécifier une date comme 2009-05-16 11: 07: 41, Europe/London et diviser cette chaîne dans le code par une virgule. –

+0

Je viens d'éditer ma réponse pour illustrer cela. –

0

Je ne pense pas qu'il est possible de faire exactement ce que vous voulez faire en utilisant SimpleDateFormat lui-même. TimeZone.parse (String) accepte uniquement les fuseaux horaires, pas le temps ID de zone, par exemple:

Time Zone ID  Time Zone (Winter)  Time Zone (Summer) 
------------------------------------------------------------- 
Europe/London  GMT      BST 

Si parse (...) accepté Europe/Londres il y aurait une heure au printemps qui ne serait pas valide Europe/Londres et une heure en automne qui correspondrait à deux heures UTC. Je pense que le mieux que vous pouvez faire est de suivre la suggestion de Bruno Rothgiesser, mais vous pouvez accepter l'ID de fuseau horaire comme une entrée utilisateur séparée ou faire une étape de traitement de chaîne supplémentaire pour séparer l'ID de fuseau horaire , et l'utiliser pour déterminer si l'utilisateur signifie probablement GMT ou BST. L'environnement local de l'utilisateur peut être une meilleure façon de déterminer ce qu'il/elle veut dire - bien qu'il y ait quelques hypothèses impliquées dans cette idée. L'algorithme "ce que l'utilisateur veut probablement dire" doit traiter deux cas particuliers - vous pouvez utiliser TimeZone.inDaylightTime (Date) avec userTime +/- 1 heure pour travailler si vous en avez un.