2011-10-07 3 views
12

J'ai le temps en millisecondes et je suis l'affichage de cette heure dans mon application au format "MM/dd/yyyy HH:mm:ss", ça fonctionne très bien.Numéro de fuseau horaire dans Android

Problème: si je change le fuseau horaire dans l'appareil android, l'affichage de l'heure différente dans mon application peut être dû à un calcul de fuseau horaire. Je veux afficher la même heure qui est dans ma base de données comme dans n'importe quel fuseau horaire.

J'utilise ci-dessous code pour tester problème de fuseau horaire

Locale locale = new Locale("en", "IN"); 

TimeZone tz = TimeZone.getDefault(); 
System.out.println("Default timezon id :: " + tz.getID()); 
tz.setID("Asia/Calcutta"); 
String timezon = tz.getDisplayName(false, TimeZone.SHORT, locale); 
System.out.println("Timezon id :: " + tz.getID() + " Timezon name :: " + timezon); 
Calendar cal = Calendar.getInstance(tz, locale); 

System.out.println("TImezon :: " + tz); 
// "1319084400775" is the milliseconds of 10/20/2011 05:20:00 in MM/dd/yyyy HH:mm:ss format 
Date date = new Date(Long.parseLong("1319084400775")); 
System.out.println("Date :: " + date.toGMTString()); 
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", locale); 

System.out.println("Start date :: " + format.format(date)); 
// "1319084400775" is the milliseconds of 10/20/2011 05:20:00 in MM/dd/yyyy HH:mm:ss format 
cal.setTimeInMillis(Long.parseLong("1319084400775")); 

timezon = cal.getTimeZone().getDisplayName(false, TimeZone.SHORT, locale); 
System.out.println("Calender's timezon :: " + timezon); 
System.out.println("Start date :: yyyy-mm-dd hh:mm:ss " + cal.get(Calendar.YEAR) + "-" + cal.get(Calendar.MONTH) + "-" + cal.get(Calendar.DAY_OF_MONTH) + " " + cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE)); 
// "1319084700776" is the milliseconds of 10/20/2011 05:25:00 in MM/dd/yyyy HH:mm:ss format 
cal.setTimeInMillis(Long.parseLong("1319084700776")); 
System.out.println("End date :: " + cal.getTime()); 

Sortie ::

Si je mets fuseau horaire pour "Pacifique/Fidji";

10-07 17:03:40.392: INFO/System.out(1193): Default timezon id :: Pacific/Fiji 
10-07 17:03:40.392: INFO/System.out(1193): Timezon id :: Asia/Calcutta Timezon name :: GMT+05:30 
10-07 17:03:40.406: INFO/System.out(1193): TImezon :: [email protected] 
10-07 17:03:40.422: INFO/System.out(1193): Date :: 20 Oct 2011 04:20:00 GMT 
10-07 17:03:40.442: INFO/System.out(1193): Start date :: 2011-10-20 16:20:00 
10-07 17:03:40.442: INFO/System.out(1193): Calender's timezon :: GMT+05:30 
10-07 17:03:40.442: INFO/System.out(1193): Start date :: yyyy-mm-dd hh:mm:ss 2011-9-20 16:20 
10-07 17:03:40.452: INFO/System.out(1193): End date :: Thu Oct 20 16:25:00 Pacific/Fiji 2011 

Si je mets fuseau horaire pour "Amérique/Tijuana";

10-06 22:05:20.702: INFO/System.out(1193): Default timezon id :: America/Tijuana 
10-06 22:05:20.712: INFO/System.out(1193): Timezon id :: Asia/Calcutta Timezon name :: GMT+05:30 
10-06 22:05:20.712: INFO/System.out(1193): TImezon :: [email protected] 
10-06 22:05:20.733: INFO/System.out(1193): Date :: 20 Oct 2011 04:20:00 GMT 
10-06 22:05:20.742: INFO/System.out(1193): Start date :: 2011-10-19 21:20:00 
10-06 22:05:20.742: INFO/System.out(1193): Calender's timezon :: GMT+05:30 
10-06 22:05:20.752: INFO/System.out(1193): Start date :: yyyy-mm-dd hh:mm:ss 2011-9-19 21:20 
10-06 22:05:20.752: INFO/System.out(1193): End date :: Wed Oct 19 21:25:00 America/Tijuana 2011 

EDIT

J'ai le temps en millisecondes maintenant je suis affichant que millisecondes dans le format de date dans ma demande, mais question est quand je changé fuseau horaire dans l'appareil que je reçois ce jour selon ce fuseau horaire.

+0

pouvez-vous ajouter (cal.get (Calendar.MONTH) +1) dans la ligne d'impression?et encore confus de quoi s'agit-il? – jazz

+0

@Shahzeb Qu'est-ce que c'est? – Dharmendra

+0

@jazz Vous pouvez voir la sortie quand je change de sortie timezon est différent que je ne veux pas signifie que je veux la même date et l'heure que je donne en entrée – Dharmendra

Répondre

12

A La date est juste un instant en temps universel. Il n'a aucune notion d'un fuseau horaire. Pensez-y comme "quand Kennedy a été tué".

Lorsque vous affichez cette heure avec un SimpleDateFormat, ce format de date a un fuseau horaire et vous affichez cet instant dans le fuseau horaire en utilisant ce fuseau horaire. Donc, si le fuseau horaire du format de date est l'heure standard centrale, cette heure sera affichée comme 12h30. Si le fuseau horaire est UTC, il sera affiché à 18h30. Si vous souhaitez afficher une date de la même manière, quel que soit le fuseau horaire, il vous suffit de choisir un fuseau horaire spécifique (UTC, par exemple) et d'afficher toujours la date avec ce fuseau horaire. Vous devez donc appeler le setTimeZone sur le DateFormat avant de formater la date.

+0

Mais si je veux utiliser le calendrier alors comment puis-je résoudre ce problème? Aidez-moi s'il vous plaît – Dharmendra

+2

Un calendrier est une enveloppe autour d'une date. Appelez getTime(), et vous obtiendrez une date. –

+0

Merci beaucoup, je reçois la solution – Dharmendra

4

En Java standard:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 
sdf.setTimeZone(TimeZone.getTimeZone(<your timezone here>); 

long millis = <your timestamp here>; //timestamps are not TZ dependent. 
Date d = new Date(millis); 
String toDisplay = sdf.format(d); 

Le fuseau horaire dans le SimpleDateFormat est le fuseau horaire fixe que vous souhaitez utiliser pour chaque date affichée, pas par défaut de l'appareil un. Assurez-vous également que la colonne d'horodatage de votre base de données commence à compter au même moment que Java (1/1/1970, époque AKA Unix) et a la même précision (millisecondes).

Il existe une autre classe android.text.format.DateFormat, mais je ne vois aucun intérêt à l'utiliser.

+0

SimpleDateFormat utilise timezone.I a vérifié votre chemin mais n'a pas résolu mon problème – Dharmendra

+1

Il doit fonctionner. Vous devez définir un fuseau horaire fixe (toujours le même). Par exemple, pour afficher les dates en Inde, utilisez le TZ de l'Inde. Lorsque l'appareil TZ change, la sortie doit être la même. –

+0

Oui, cela fonctionne mais si je veux utiliser Calendar, comment puis-je résoudre ce problème? – Dharmendra

3

Je reçois la solution comme ci-dessous la méthode

/** 
    * Date time must be in milliseconds 
    * return Time in milliseconds 
    */ 
    public static String getTimeInMilli(Context ctx, String datetime) { 
     Calendar cal = Calendar.getInstance(); 
     cal.setTimeInMillis(Long.parseLong(datetime)); 
     //This will return daylight savings offset in milliseconds.You have to Subtract this milliseconds from calendar 
     int dayLightSaving = cal.get(Calendar.DST_OFFSET); 

     cal.setTimeInMillis(cal.getTimeInMillis() - dayLightSaving); 

     TimeZone z = cal.getTimeZone(); 
     int offset = z.getRawOffset(); 
     int offsetHrs = offset/1000/60/60; 
     int offsetMins = offset/1000/60 % 60; 

     // Subtract offset of your current TimeZone 
     cal.add(Calendar.HOUR_OF_DAY, (-offsetHrs)); 
     cal.add(Calendar.MINUTE, (-offsetMins)); 

     cal.setTimeZone(TimeZone.getTimeZone("GMT")); 

     //add offset of your TimeZone 
     cal.add(Calendar.HOUR_OF_DAY, 5); 
     cal.add(Calendar.MINUTE, 30); 

     return String.valueOf(cal.getTimeInMillis()); 
    } 

Maintenant, si je change fuseau horaire dans mon appareil ma date de l'application de la volonté reste la même.