2011-10-07 40 views
12

Tôi có thời gian bằng mili giây và tôi hiển thị thời gian đó trong đơn đăng ký của mình ở định dạng "MM/dd/yyyy HH:mm:ss", nó hoạt động tốt.Sự cố múi giờ trong Android

Sự cố: nếu tôi thay đổi múi giờ trong thiết bị Android, thời gian hiển thị trong ứng dụng của tôi có thể là do tính toán múi giờ. Tôi muốn hiển thị cùng một thời điểm trong cơ sở dữ liệu của tôi vì nó nằm trong bất kỳ múi giờ nào.

Tôi đang sử dụng mã dưới đây để kiểm tra vấn đề múi giờ

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

Output ::

Nếu tôi đặt múi giờ cho "Thái Bình Dương/Fiji";

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 

Nếu tôi đặt múi giờ cho "Mỹ/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

tôi có thời gian trong mili giây bây giờ tôi đang hiển thị rằng mili giây ở định dạng ngày tháng trong ứng dụng của tôi, nhưng vấn đề là khi tôi đã thay đổi múi giờ trên điện thoại tôi nhận được ngày theo múi giờ đó.

+0

bạn có thể thêm (cal.get (Calendar.MONTH) +1) vào dòng in không?và vẫn còn bối rối truy vấn của bạn là gì? – jazz

+0

@Shahzeb Đây là gì? – Dharmendra

+0

@jazz Bạn có thể thấy đầu ra khi tôi thay đổi đầu ra timezon khác nhau mà tôi không muốn có nghĩa là tôi muốn ngày và giờ giống như tôi nhập vào số – Dharmendra

Trả lời

12

Ngày chỉ là một khoảnh khắc trong thời gian quốc tế. Nó không có khái niệm về múi giờ. Hãy nghĩ về nó như là "khi Kennedy bị giết".

Khi bạn hiển thị thời gian này với SimpleDateFormat, định dạng ngày này có múi giờ và bạn hiển thị ngay lập tức này bằng múi giờ này. Vì vậy, nếu múi giờ của định dạng ngày là giờ chuẩn trung tâm, thời gian này sẽ được hiển thị là 12:30. Nếu múi giờ là UTC, múi giờ sẽ được hiển thị là 18:30.

Nếu bạn muốn một số ngày được hiển thị theo cùng một cách, bất kể múi giờ, bạn chỉ cần chọn múi giờ cụ thể (ví dụ UTC) và luôn hiển thị ngày với múi giờ này. Do đó, bạn phải gọi setTimeZone trên DateFormat trước khi định dạng ngày.

+0

Nhưng nếu tôi muốn sử dụng Lịch thì làm thế nào tôi có thể giải quyết vấn đề này? Xin hãy giúp tôi – Dharmendra

+2

Lịch là một trình bao bọc quanh một ngày. Gọi getTime() và bạn sẽ nhận được một ngày. –

+0

Cảm ơn rất nhiều người đàn ông tôi nhận được giải pháp – Dharmendra

4

Trong Java tiêu chuẩn:

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

Các múi giờ trong SimpleDateFormat là múi giờ cố định bạn muốn sử dụng cho mỗi ngày hiển thị, không phải của thiết bị mặc định một. Cũng đảm bảo rằng cột dấu thời gian trong cơ sở dữ liệu của bạn bắt đầu đếm tại cùng một thời điểm so với Java (1/1/1970, AKA Unix epoch), và có cùng một precission (mili giây).

Có một lớp android.text.format.DateFormat khác, nhưng tôi không thấy bất kỳ điểm nào khi sử dụng nó.

+0

SimpleDateFormat sử dụng timezone.I đã kiểm tra theo cách của bạn nhưng không giải quyết được vấn đề của tôi – Dharmendra

+1

Nó phải hoạt động. Bạn phải đặt múi giờ cố định (luôn giống nhau). Ví dụ: để hiển thị ngày ở Ấn Độ, hãy sử dụng TZ của Ấn Độ. Khi thiết bị TZ thay đổi, đầu ra phải giống nhau. –

+0

Có, nhưng nếu tôi muốn sử dụng Lịch thì làm thế nào tôi có thể giải quyết vấn đề này – Dharmendra

3

tôi nhận được các giải pháp như dưới đây phương pháp

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

Bây giờ nếu tôi thay đổi múi giờ trong điện thoại của tôi ngày nộp đơn của tôi sẽ vẫn giống nhau.

Các vấn đề liên quan