日历getTimeInMillis相差1小时

时间:2015-11-10 09:08:17

标签: java android datepicker calendar timepicker

我正在编写一个在用户界面中有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);

更新

再次检查代码后,您发现我的TimePicker给出了错误的值。

2 个答案:

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