首页 > 代码库 > 关于日期和时间
关于日期和时间
之所以会涉及到这一块主要是在一个项目中,数据是以时间为唯一索引的。
该数据每天只产生一条,所以设计中将GMT时间天的0时0分0秒0毫秒作为数据索引。
初时并没有发现什么不妥,到项目后期,一个开发人员提出了关于时区的问题,比如我们中国属于东八区,
也就是时间会比GMT时间早8个小时, 当GMT时间为0点,中国时间为8点,
而比如中国时间为7点时,GMT时间为昨天的23点!
坑货!这就是没有考虑到的时区问题!
按照正常的逻辑,所以日期都应该是以本地时间为准的,
折腾了挺久,最终找到完美的解决方案:
先说下基本思路:
1、日期应该以本地为准,日期的变更是本地直接可感的
2、需要把日期转为为唯一的时间戳,以作为数据库的唯一索引
3、时间戳最好以GMT时间为准
代码思路:
1、建立一张本地日历,获得本地的日期
2、建议一张GMT日历,设置1中得到的日期,并把时分秒毫秒归零
3、从GMT日历中获得时间戳
整体代码实现如下:
private void testTime1() { text1.setText(""); //文本清空 //获得默认日历的日期 Calendar calDefault = Calendar.getInstance(); // Calendar calDefault = new GregorianCalendar(TimeZone.getTimeZone("GMT-12")); int year = calDefault.get(Calendar.YEAR); int month = calDefault.get(Calendar.MONTH); int day = calDefault.get(Calendar.DAY_OF_MONTH); text1.append(calDefault.getTimeInMillis()+"\n"); text1.append(calDefault.toString()+"\n"); //设置GMT日历为相同日期,且时分秒毫秒置零 Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT")); cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, month); cal.set(Calendar.DAY_OF_MONTH, day); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); long time = cal.getTimeInMillis(); text1.append( time+"\n"); text1.append(cal.toString()+"\n"); }其中特别需要注意的是,日历在设置完参数后并不利己生成相应的时间戳,
查看源码可以发现
protected abstract void computeTime();
用来实现时间戳的生成,可惜该方法是protected ,我们无法直接使用,
顺藤摸瓜,搜索下发现
public long getTimeInMillis();
会调用computeTime()方法。
综上,我们在给日历设置完参数后,需要调用getTimeInMillis()才会生成相应的时间戳。
以上,完毕。
关于日期和时间
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。