2015-04-26 1 views
1

J'essaie d'afficher la différence entre deux dates, réparties en mois, jours, heures, minutes et secondes. Le code ci-dessous semble fonctionner, sauf que les heures sont toujours décalées de 4. J'ai essayé HEURE et HOUR_OF_DAY, mais j'ai obtenu les mêmes résultats.Les heures sont désactivées par 4

Calendar cal = Calendar.getInstance(); 

    int year = cal.get(Calendar.YEAR); 
    int month = cal.get(Calendar.MONTH); 
    int day = cal.get(Calendar.DAY_OF_MONTH); 
    int hour = cal.get(Calendar.HOUR); 
    int minutes = cal.get(Calendar.MINUTE); 
    int seconds = cal.get(Calendar.SECOND); 


    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 

    try { 
     //get the current date/time 
     Date beginDate = cal.getTime(); 

     //fabricate a future date/time 
     Date endDate = dateFormat.parse(String.valueOf(year) + "-" + String.valueOf(month) 
       + "-" + String.valueOf(day+95) + " " + String.valueOf(hour+2) 
       + ":" + String.valueOf(minutes +16) + ":" + String.valueOf(seconds +34)); 

     long millis = endDate.getTime() - beginDate.getTime(); 

     TextView txtMonths = (TextView) findViewById(R.id.months); 
     txtMonths.setText("Months: " + (new SimpleDateFormat("M")).format(new Date(millis))); 

     TextView txtDays = (TextView) findViewById(R.id.days); 
     txtDays.setText("Days: " + (new SimpleDateFormat("d")).format(new Date(millis))); 

     TextView txtHours = (TextView) findViewById(R.id.hours); 
     txtHours.setText("Hours: " + (new SimpleDateFormat("h")).format(new Date(millis))); 

     TextView txtMinutes = (TextView) findViewById(R.id.minutes); 
     txtMinutes.setText("Minutes: " + (new SimpleDateFormat("m")).format(new Date(millis))); 

     TextView txtSeconds = (TextView) findViewById(R.id.seconds); 
     txtSeconds.setText("Seconds: " + (new SimpleDateFormat("s")).format(new Date(millis))); 

    } catch (ParseException ex) { 
     Log.d("ParseException", ex.toString()); 

    } 

Il a été suggéré que c'était à cause de TimeZone. Je suis GMT et DST = +8 vrai, alors

TimeZone timeZone = cal.getTimeZone(); 
timeZone.getOffset(System.currentTimeMillis())); 

Retours 7 heures non 4. Suis-je manque quelque chose avec des informations TimeZone?

+5

Vous ne tenez pas compte des fuseaux horaires, j'imagine. – CommonsWare

+1

Vérifiez que le fuseau horaire n'est pas le problème. Régulièrement au large de 4 heures semble être le cas. – Sami

+0

Oui, fuseau horaire. Merci. Je suis GMT +8. Je me demande où il se présente avec 4. – user1091524

Répondre

0

EST MAL CE Je pensais que je l'avais, mais je ne le font pas.

Je pense qu'il était le fuseau horaire, mais je ne suis toujours pas sûr de savoir comment il est venu avec 4 quand je suis GMT + 8 et l'heure d'été. Donc, alors que le code ci-dessous semble fonctionner, je me sentirais plus à l'aise si elle avait été désactivée par 7 ou 8. Si cela avait été le cas, le fuseau horaire serait apparu sur moi immédiatement.

Java peut être brutal.

Calendar cal = Calendar.getInstance(); 
    TimeZone UTC = TimeZone.getTimeZone("UTC"); 
    cal.setTimeZone(UTC); 

    int year = cal.get(Calendar.YEAR); 
    int month = cal.get(Calendar.MONTH); 
    int day = cal.get(Calendar.DAY_OF_MONTH); 
    int hour = cal.get(Calendar.HOUR); 
    int minutes = cal.get(Calendar.MINUTE); 
    int seconds = cal.get(Calendar.SECOND); 


    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 

    try { 
     //get the current date/time 
     Date beginDate = cal.getTime(); 

     //fabricate a future date/time 

     endDate = dateFormat.parse(String.valueOf(year) + "-" + String.valueOf(month) 
       + "-" + String.valueOf(day+95) + " " + String.valueOf(hour+2) 
       + ":" + String.valueOf(minutes +1) + ":" + String.valueOf(seconds +34)); 
     dateFormat.setTimeZone(UTC); 

     long millis = endDate.getTime() - beginDate.getTime(); 

     if (TimeZone.getDefault().inDaylightTime(new Date())) { 
      millis += 3600000; 
     } 

     TextView txtMonths = (TextView) findViewById(R.id.months); 
     txtMonths.setText("Months: " + (new SimpleDateFormat("M")).format(new Date(millis))); 

     TextView txtDays = (TextView) findViewById(R.id.days); 
     txtDays.setText("Days: " + (new SimpleDateFormat("d")).format(new Date(millis))); 

     TextView txtHours = (TextView) findViewById(R.id.hours); 
     txtHours.setText("Hours: " + (new SimpleDateFormat("h")).format(new Date(millis))); 

     TextView txtMinutes = (TextView) findViewById(R.id.minutes); 
     txtMinutes.setText("Minutes: " + (new SimpleDateFormat("m")).format(new Date(millis))); 

     TextView txtSeconds = (TextView) findViewById(R.id.seconds); 
     txtSeconds.setText("Seconds: " + (new SimpleDateFormat("s")).format(new Date(millis))); 
    } catch (ParseException ex) { 
     Log.d("ParseException", ex.toString()); 

    }