毫无疑问,Java作为Android最主要的开发语言,它具有方法将时间戳直接转化为日期对象(Date 或 Calendar)的,但是作为在手机上运行的虚拟机,又有一些区别了。
/** 由时间戳转化为文本,时间单位:ms */
private String getTime(long time) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String date = sdf.format(time);
return date;
}
这是我最开始写的将时间戳转化为格式时间字符串的方法,这个方法直接在JVM上面跑完全没问题!但是我让这些代码在手机里面跑的话,时间就会差上那么几个小时。由于时间差的并不是很多,大概也就是几个小时,猜测是时区什么鬼的应该没设好。于是
/** 由时间戳转化为文本,时间单位:ms */
private String getTime(long time) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss",Locale.CHINA);
String date = sdf.format(time);
return date;
}
完全没用(WTF?)这个方法行不通,就只能设死时区了,在Android中对时区的设置由TimeZone控制,所以
/** 由时间戳转化为文本 */
private String getTime(String time) {
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8:00"));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String date = sdf.format(Long.parseLong(time + "000"));
return date;
}
终于他妈对了!!就是这样!Timestamp在Android上的转换绝对不能忘记时区的变换,这样得出的时间才是正确的。但我后来心想也不对,他默认获得的时区应该是系统默认的时区,这样的话我得到时区应该是对的才对,看了以下AVD模拟器,原来里面设置的时区是默认了,注释掉改时区的代码,修改了一下设置里的时区,然后重新跑一遍。
测试完毕。。发现在模拟器时间已正常。结论 改时区代码如上,如果不确定系统默认时区,设置时区代码最好还是加上!