java时间处理

来源:互联网 发布:android源码 编辑:程序博客网 时间:2024/05/22 04:26
为了解决不同的时区的影响,引入了一个“绝对时间”的概念。绝对时间不需要年月日,而是以秒来计时。当前时间是指从一个基准时间(1970-1-1 00:00:00 +0:00),到现在的秒数,用一个整数表示

当我们用绝对时间表示日期和时间时,无论服务器在哪个时区,任意时刻,他们生成的时间值都是相等的。所有编程语言都提供了方法来生成这个时间戳,Java和JavaScript输出以毫秒计算的Long型整数,Python等输出标准的Unix时间戳,以秒计算的Float型浮点数,这两者转换只存在1000倍的关系。

实际上,操作系统内部的计时器也是这个标准的时间戳,只有在显示给用户的时候,才转换为字符串格式的本地时间。

基于“数据的存储和显示相分离”的设计原则,我们只要把表示绝对时间的时间戳(无论是Long型还是Float)存入数据库,在显示的时候根据用户设置的时区格式化为正确的字符串。

数据的存储和显示相分离是非常基本的设计原则,却常常被大多数开发人员忽略。举个例子,在Excel中编写一个表格,表格的数据可视为数据的存储格式,你可以把表格的数据以柱状图或饼图表示出来,这些不同的图表是数据的不同显示格式,存储数据的时候,我们应该存储表格数据,绝不应该存储柱状图等图片信息。

HTML和CSS也是数据的存储和显示相分离的设计思想。

所以,数据库存储时间和日期时,只需要把Long或者Float表示的时间戳存到BIGINTREAL类型的列中,完全不用管数据库自己提供的DATETIMETIMESTAMP,也不用担心应用服务器和数据库服务器的时区设置问题,遇到Oracle数据库你不必去理会with timezonewith local timezone到底有啥区别。

读取时间时,读到的是一个Long或Float,只需要按照用户的时区格式化为字符串就能正确地显示出来:


基于绝对时间戳的时间存储,从根本上就没有时区的问题。时区只是一个显示问题。额外获得的好处还包括:

  • 两个时间的比较就是数值的比较,根本不涉及时区问题,极其简单;

  • 时间的筛选也是两个数值之间筛选,写出SQL就是between(?, ?)

  • 显示时间时,把Long或Float传到页面,无论用服务端脚本还是用JavaScript都能简单而正确地显示时间。

你唯一需要编写的两个辅助函数就是String->LongLong->StringString->Long的作用是把用户输入的时间字符串按照用户指定时区转换成Long存进数据库。


唯一的缺点是数据库查询你看到的不是时间字符串,而是类似1413266801750之类的数字。

下面是几个常用的案例(Java语言实现)

String转换成long

         //String类型到long的转换
         try {
              String d= "2016-03-05" ;
              SimpleDateFormat sdf_sl= new SimpleDateFormat("yyyy-MM-dd" );
              Date date= sdf_sl.parse( d);
              long sl= date.getTime();
              System. out.println( "\nString转换成long后的值是:\n" +sl );
         } catch (ParseException e) {
              e.printStackTrace();
       }



long转换成String的方法如下(不同时区之间按照一定格式输出当前时间)

      public static void main(String[] args) {

           //获取当前时间与1970/00/00/00:00:00:00之间相差的毫秒值
           long t=System. currentTimeMillis();

           //设置显示 的格式
          SimpleDateFormat sdf= new SimpleDateFormat("yyyy年 MM月 dd日 ah点 mm分 ss秒" );

           //系统默认显示时区
          System. out.println( "当前系统默认所在地时间:\n" +sdf .format(t ));

           //美国夏令时
           sdf.setTimeZone(TimeZone. getTimeZone( "America/Los_Angeles"));
          System. out.println( "\n当前美国洛杉矶时间:\n" +sdf .format(t ));

     }
1 0
原创粉丝点击