zoukankan      html  css  js  c++  java
  • 关于日期和时间

    之所以会涉及到这一块主要是在一个项目中,数据是以时间为唯一索引的。

    该数据每天仅仅产生一条。所以设计中将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()+"
    ");
            text1.append(calDefault.toString()+"
    ");
    
            //设置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+"
    ");
            text1.append(cal.toString()+"
    ");
        }
    当中特别须要注意的是,日历在设置完參数后并不利己生成对应的时间戳。

    查看源代码能够发现

     protected abstract void computeTime();

    用来实现时间戳的生成,可惜该方法是protected ,我们无法直接使用。

    顺藤摸瓜。搜索下发现

     public long getTimeInMillis();

    会调用computeTime()方法。


    综上,我们在给日历设置完參数后,须要调用getTimeInMillis()才会生成对应的时间戳。

    以上,完成。




  • 相关阅读:
    Spring--IOC
    神奇的小东西
    视图层发起请求的方式
    jdbc “贾琏欲执事”
    线程的五种状态
    java的<<左移,>>右移,>>>无符号右移
    直接插入排序(单链表排序)
    单链表相关知识以及指针引用相关知识
    将一个数n分解为若干个从小到大排列的质数的积 ,求质数因子
    最小二乘法
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5180421.html
Copyright © 2011-2022 走看看