日历getTimeInMillis相差1小时

我正在编写一个在UI中有DatePickerTimePicker的应用程序。 我需要获取用户设置的日期和时间并存储在服务器中。

例如,用户选择“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); 

更新2015/11/11 23:03

再次检查代码后,U发现我的TimePicker给出了错误的值。 根据Mattia Maestrini的请求,这是我创建时间选择器的代码: https ://dl.dropboxusercontent.com/u/4256111/AddApptDialogFragment.java

更新2015/11/12 07:14

案件结案。 这是因为TimePicker。 请查看答案的评论。

更新2015/11/14 23:17

Calendar.currentTimeMillis()实际上给出了与时区无关的时间(即UTC)。 这个链接( Java:Timezone为什么不同的时区以毫秒为单位给出相同的值 )是如此误导! 这应该是你应该看到的: 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); 

如果你想要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