我正在编写一个在用户界面中有DatePicker
和TimePicker
的应用。我需要获取用户设置的日期和时间并存储在服务器中。
例如,用户选择“2015年11月13日13:00”,我的模拟器的时区设置为GMT + 8,GMT中返回的timeInSec
独立于时区应为“1447390800”,但它原来是“1447387200”,相差1小时。结束我从服务器收到的显示时间也错了。
为什么会这样?与GMT时区国家的夏令时有关或我在代码中做错了什么?在我的国家,没有夏令时..
这是我的代码:
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);
再次检查代码后,您发现我的TimePicker给出了错误的值。
答案 0 :(得分:3)
如果您想要UTC时间戳,可以直接使用getTimeInMillis()
public long getTimeInMillis()
返回:当前时间为纪元的UTC毫秒数。
参考:
http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#getTimeInMillis()
例如,使用GMT + 8时区将日历日期设置为13 Nov 2015 13:00
:
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
答案 1 :(得分:0)
(代表问题作者发布)。
问题出在TimePicker上。
Calendar.currentTimeMillis()
实际上给出了时区(即UTC)的时间独立。此链接(Java: Timezone why different timezone give same value in millisec)真是令人误解!这应该是您应该查看的内容:http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#getTimeInMillis()
所以我应该这样做:
Calendar cal = Calendar.getInstance();
cal.set(mDatePicker.getYear(), mDatePicker.getMonth(), mDatePicker.getDayOfMonth(), mTimePicker.getCurrentHour(), mTimePicker.getCurrentMinute(), 0);
long timeInSec = (cal.getTimeInMillis()/1000);