2011-10-07 24 views
12

Milisaniye cinsinden zamanım var ve uygulamanızda bu süreyi "MM/dd/yyyy HH:mm:ss" biçiminde görüntülüyorsam iyi çalışıyor.Android'de saat dilimi sorunu

Sorun: Android cihazında saat dilimini değiştirirsem uygulamamda farklı bir saat görüntüleniyorsa, zaman dilimi hesaplaması nedeniyle olabilir. Herhangi bir zaman dilimi içinde olduğu gibi benim veritabanında aynı zamanı görüntülemek istiyorum.

Ben saat dilimi konuyu test etmek kodunun altına kullanıyorum

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()); 

Çıktı :: Ben "Pasifik/Fiji" saat dilimini ayarlarsanız

;

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 

Ben "Amerika/Tijuana" saat dilimini ayarlarsanız;

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 

DÜZENLEME

Şimdi ben cihazda dilimini değiştirmeme O saat dilimine göre tarih aldığımda benim uygulamada ancak sayısında tarih biçiminde milisaniye olduğunu gösteren ediyorum milisaniye cinsinden zaman var.

+0

Baskı hattına (cal.get (Calendar.MONTH) +1) ekleyebilir misiniz?ve hala şaşkınlık senin sorgusunun ne hakkında? – jazz

+0

@Shahzeb Bu nedir? – Dharmendra

+0

@jazz Çıktıyı değiştirdiğimde çıktıyı görebiliyorum farklı değil demek istediğim aynı tarih ve saatte girdi vermek istiyorum – Dharmendra

cevap

12

A Tarih, evrensel zamanda yalnızca bir andır. Bir zaman dilimi kavramı yok. Bunu "Kennedy öldürüldüğünde" olarak düşün.

Bu süreyi SimpleDateFormat ile görüntülediğinizde, bu tarih biçiminin bir saat dilimi vardır ve bu anı, bu saat dilimini kullanarak zamanında görüntülersiniz. Dolayısıyla, tarih biçiminin saat dilimi merkezi standart saat ise, bu saat 12:30 olarak görüntülenir. Saat dilimi UTC ise, saat 18:30 olarak görüntülenir.

Saat dilimi ne olursa olsun, bir tarihin aynı şekilde görüntülenmesini isterseniz, yalnızca belirli bir saat dilimini (örneğin UTC) seçmeniz ve her zaman tarihi bu saat dilimi ile göstermeniz gerekir. Bu nedenle, tarihi biçimlendirmeden önce DateFormat numaralı telefondan setTimeZone numaralı telefonu aramanız gerekir. Standart Java

+0

olarak ayarlıyorum. Ancak Takvim'i kullanmak istiyorsam, bu sorunu nasıl çözebilirim? Lütfen bana yardım edin – Dharmendra

+2

Takvim, bir tarihteki sarıcıdır. GetTime() öğesini çağırın ve bir tarih alacaksınız. –

+0

Çok teşekkürler, ben – Dharmendra

4

: SimpleDateFormat yılında

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); 

saat dilimi her görüntülenen tarih değil, cihazın varsayılan bir için kullanmak istediğiniz sabit zaman dilimi olduğunu. Ayrıca, veritabanınızdaki zaman damgası sütununun Java'dan (1/1/1970, AKA Unix döneminden) aynı noktaya kadar saymaya başladığından ve aynı önceliğe (milisaniye) sahip olduğundan emin olun.

Başka bir android.text.format.DateFormat sınıfı var ama kullanmanın bir anlamı yok. Benim uygulamanın tarih irade aynı kalır Cihazımda zaman dilimini değiştirmek eğer

+0

SimpleDateFormat, saat dilimini kullanır. Yolunuzu kontrol ettim ancak sorunumu çözmedim – Dharmendra

+1

Çalışması gerekiyor. Sabit bir zaman dilimi ayarlamanız gerekir (her zaman aynı). Örneğin, Hindistan'daki tarihleri ​​görüntülemek için Hindistan TZ'yi kullanın. Cihaz TZ değiştiğinde, çıkış aynı olmalıdır. –

+0

Evet çalışıyor, ancak Takvim'i kullanmak istiyorsam bu sorunu nasıl çözebilirim? – Dharmendra

3

Ben Şimdi yöntemle

/** 
    * 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()); 
    } 

altına gibi çözüm olsun.

İlgili konular