2015-11-10 3 views
2

Я пишу приложение, которое имеет DatePicker и TimePicker в пользовательском интерфейсе. Мне нужно установить дату и время, установленные пользователем и сохранить на сервере.Календарь getTimeInMillis разница 1 час

Например, пользователь выбрал «13 ноября 2015 года 13:00», а часовой пояс моего эмулятора установлен как GMT + 8, возвращенный timeInSec в GMT, независимо от часового пояса, должен быть «1447390800», но, оказывается, «1447387200», разница 1 час. В конечном итоге мое отображаемое время, полученное от сервера, также неверно.

Почему это так? Что-то связано с летней экономией в странах с часовым поясом в мире или что я сделал неправильно в коде? В моей стране нет декретных ..

Вот мой код:

Calendar cal = Calendar.getInstance(); 
cal.set(mDatePicker.getYear(), mDatePicker.getMonth(), mDatePicker.getDayOfMonth(), mTimePicker.getCurrentHour(), mTimePicker.getCurrentMinute(), 0); 
// get time in seconds independent of timezone <- update on 2015/11/14: this is wrong!! 
long timezoneOffset = cal.getTimeZone().getOffset(cal.getTimeInMillis()); 
long timeInSec = ((cal.getTimeInMillis() + timezoneOffset)/1000); 

Update 2015/11/11 23:03 После повторной проверки через код, я нашел, что это дает мой TimePicker неправильное значение. По просьбе Маттиа MAESTRINI, вот мой код, который создает Time Picker: https://dl.dropboxusercontent.com/u/4256111/AddApptDialogFragment.java

Update 2015/11/12 7:14 Дело закрыто. Это из-за TimePicker. Pls заглядывает в комментарий для ans.

Update 2015/11/14 23:17 Omg ... Calendar.currentTimeMillis() на самом деле дает время независимую из временной зоны (т.е. UTC)! Эта ссылка (Java: Timezone why different timezone give same value in millisec) настолько вводит в заблуждение! Это SHLD быть, что у SHLD смотреть на: http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#getTimeInMillis()

Так я SHLD быть просто делает это:

Calendar cal = Calendar.getInstance(); 
cal.set(mDatePicker.getYear(), mDatePicker.getMonth(), mDatePicker.getDayOfMonth(), mTimePicker.getCurrentHour(), mTimePicker.getCurrentMinute(), 0); 
long timeInSec = (cal.getTimeInMillis()/1000); 

ответ

1

Если вы хотите UTC временную метку можно непосредственно использовать getTimeInMillis()

общественности долго getTimeInMillis()

Возврат: Текущее время как UTC в миллисекундах с эпохи.

Ссылка:
http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#getTimeInMillis()

Например установить календарную дату, чтобы 13 Nov 2015 13:00 с GMT + 8 часового пояса:

Calendar calendar = Calendar.getInstance(); 
calendar.set(2015, Calendar.NOVEMBER, 13, 13, 0, 0); 
int timeInSec = calendar.getTimeInMillis()/1000; 

значение timeInSec является 1447390800

РЕДАКТИРОВАТЬ

Каков результат, который вы получаете с помощью этого фрагмента кода?

Calendar calendar = Calendar.getInstance(); 
calendar.set(2015, Calendar.NOVEMBER, 13, 13, 0, 0); 
int offset = calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET); 
long utcTimeInMillis = calendar.getTimeInMillis() + offset; 

Calendar utcCalendar = Calendar.getInstance(Locale.ENGLISH); 
utcCalendar.setTimeInMillis(utcTimeInMillis); 

Log.d(TAG, "Time: " + calendar.getTime()); 
Log.d(TAG, "TimeInMillis: " + calendar.getTimeInMillis()); 
Log.d(TAG, "DisplayName: " + calendar.getTimeZone().getDisplayName()); 
Log.d(TAG, "Offset: " + offset); 
Log.d(TAG, "UTC Time: " + utcCalendar.getTime()); 
Log.d(TAG, "UTC TimeInMillis: " + utcTimeInMillis); 

Это результат я получил:

Time: Fri Nov 13 13:00:00 GMT+08:00 2015 
TimeInMillis: 1447390800061 
DisplayName: Hong Kong Standard Time 
Offset: 28800000 
UTC Time: Fri Nov 13 21:00:00 GMT+08:00 2015 
UTC TimeInMillis: 1447419600061 
+0

cal.getTimeInMillis() зависит от моего часового пояса. Http: // StackOverflow.com/questions/13083243/calendar-gettimeinmillis-is-timezone-depend? rq = 1 Я намеренно минус смещение по часовой пояс по этой причине. Если я храню на сервере это значение, полученное значение также неверно. – yeeen

+0

@yeeen Я только что обновил свой ответ, какое значение вы получили с помощью этого кода? –

+0

То же, что и мое, когда округляется до секунд. Я обнаружил, что это мой TimePicker, который дает мне неправильное время! Я выбрал 13:00, почему это происходит, когда я получаю getCurrentHour() и getCurrentMinute(), вместо этого он дает мне 4 и 0? Я пробовал другие даты и время, это всегда 9 часов раньше, чем мое выбранное время! – yeeen

Смежные вопросы