2010-10-02 21 views
1

Je suis à la hauteur de ma fin sur ce problème ennuyeux. Fondamentalement, ne pouvait pas résoudre ce problème pendant une longue période.Y at-il quelque chose qui cloche avec SimpleDateFormat année et fuseau horaire formage

 java.util.Calendar calendar_now = java.util.Calendar.getInstance(); 
    java.util.Calendar calendar_entry = java.util.Calendar.getInstance(); 
    java.util.Date dt = new Date(); 
    java.text.SimpleDateFormat formatter; 
    try{ 
    // if(this.Time.length() == 0) {this.Time = "00:00";} 
    //this.Time = "00:00"; 
    // System.out.println("*" + this.Time + "*"); 
    if((this.Time.substring(this.Time.length() - 2) == "am")||(this.Time.substring(this.Time.length() - 2) == "pm")) 
    { 
     formatter = new SimpleDateFormat("yyyy E MMM d H:mmaa z",Locale.US); 
     dt = (Date)formatter.parse(calendar_now.get(java.util.Calendar.YEAR) + " " + this.Date + " " + this.Time + " EST"); 
     //calendar_entry.setTimeZone(java.util.TimeZone.getTimeZone("America/New_York")); 
    } 
     calendar_entry.setTime(dt); 
     if (calendar_entry.get(java.util.Calendar.MONTH) < calendar_now.get(java.util.Calendar.MONTH)){ 
     calendar_entry.set(java.util.Calendar.YEAR,calendar_now.get(java.util.Calendar.YEAR) + 1); 
     } 
    else{ 
     calendar_entry.set(java.util.Calendar.YEAR,calendar_now.get(java.util.Calendar.YEAR)); 
    } 
// calendar_entry.setTimeZone(java.util.TimeZone.getTimeZone("GMT")); 
     System.out.println(calendar_now.get(java.util.Calendar.YEAR) + " " + this.Date + " " + this.Time + " EST"); 
     System.out.println(dt.toString()); 
     System.out.println(calendar_entry); 

Ce produit:

 
2010 Fri Oct 1 10:00am EST 
Thu Oct 01 10:00:00 SGT 1970 
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.uti 
l.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],fi 
rstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2010,MONTH=9,WEEK_OF_YEAR=40,WEEK_OF_MONTH=1,DAY_ 
OF_MONTH=1,DAY_OF_YEAR=274,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE= 
30,SECOND=0,MILLISECOND=0,ZONE_OFFSET=0,DST_OFFSET=0] 

La question est ... POURQUOI?

+3

La question est - ce qui ne va pas? Je parie que vous auriez une meilleure réponse si vous indiquiez ce qui ne va pas et pourquoi. Ne faites pas les gens lire à travers ce gâchis pour comprendre ce qui vous dérange. – duffymo

Répondre

1

Je n'ai aucune idée de ce que vous avez et de ce que vous aimeriez obtenir, mais je vois au moins une erreur majeure dans le code. Dans cette ligne

if((this.Time.substring(this.Time.length() - 2) == "am")||(this.Time.substring(this.Time.length() - 2) == "pm")) 

vous comparez String par référence, non par valeur. Vous devriez utiliser Object#equals() chaque fois que vous voulez comparer deux objets différents. Un String est à savoir un objet, pas une primitive comme int, boolean, etc, pour lequel le == fonctionnerait comme prévu et attendu.

if((this.Time.substring(this.Time.length() - 2).equals("am"))||(this.Time.substring(this.Time.length() - 2).equals("pm"))) 

Cependant, je vous suggère d'utiliser la méthode à la place String#endsWith(). C'est non seulement plus concis, mais rend également le code plus auto-explication:

if (this.Time.endsWith("am") || this.Time.endsWith("pm")) 

Cela dit, il y a indubitablement une façon plus élégante pour tout ce que vous souhaitez réaliser, mais étant donné que les exigences fonctionnelles ne sont pas claires, il est impossible de vous donner un exemple de coup d'envoi.

+0

Ok maintenant le code semble certainement plus beau. J'aurais peut-être dû poser une question plus précise. Pourquoi l'année et le TimeZone ne sont pas modifiés dans l'objet Date tout comme la chaîne d'origine ???? Son supposé donner 2010 EST et son donner SGT 1970 à la place? – user464362

+0

Parce que le bloc 'if' n'a jamais été entré. – BalusC

+0

merci beaucoup cela fonctionne maintenant. va essayer de comprendre pourquoi seulement l'heure/la date fonctionne. – user464362

1

En parcourant votre code, il semble que les lignes de code suivantes (que vous attendez pour le formatage) ne soient jamais exécutées. Comme le signale justement BalusC, cela est dû à une déclaration conditionnelle non valide pour String comaprison. c'est-à-dire que vous utilisez "==" au lieu de la méthode ".equals". Votre problème serait résolu en corrigeant même comme suggéré par BalusC en utilisant:

if (this.Time.endsWith("am") || this.Time.endsWith("pm")) 

au lieu de:

if((this.Time.substring(this.Time.length() - 2) == "am")||(this.Time.substring(this.Time.length() - 2) == "pm")) 
+0

Ok, maintenant le code semble certainement plus beau. J'aurais peut-être dû poser une question plus précise. Pourquoi l'année et le TimeZone ne sont pas modifiés dans l'objet Date tout comme la chaîne d'origine ???? Son supposé donner 2010 EST et son donner SGT 1970 à la place? – user464362

+0

Voilà ce que j'ai répondu. Vous définissez l'heure de la date et le fuseau horaire dans l'objet "dt" avec un bloc conditionnel qui ne s'exécute jamais. N'utilisez pas "==" pour la comparaison de chaînes. La condition est toujours fausse en raison de l'utilisation de "==" dans votre cas.S'il vous plaît essayer la condition comme suggéré dans ma réponse, cela devrait fonctionner comme prévu. – YoK

+0

merci beaucoup cela fonctionne maintenant. va essayer de comprendre pourquoi seulement l'heure/la date fonctionne. – user464362