android 时间格式及时间差问题

来源:互联网 发布:qqlogin js 编辑:程序博客网 时间:2024/04/29 15:34

最近做的项目中,聊天界面设计到时间格式的问题,因为以前没有仔细研究过时间格式以及时间差的问题,所以把android时间方面的知识恶补了一下。

一、首先介绍一下时间概念。

在android中时间分为三种形式,1、时间戳 (1441355176150) 2、Date时间格式(Fri Sep 04 11:20:00 GMT+0800 2015)3、时间的字符串格式(20150903112723)。时间的字符串格式是导致时间问题出错的主要原因,我刚开始一直觉得时间戳就是时间的字符串形式,其实不然。时间的字符串形式是直接将时间的各个组成部分拼成String类型组成,例如(2015年09月03日11时27分23秒 ,2015-09-03 11:27:23都是时间的字符串形式),而最容易出错的就是20150903112723,不要把这个理解成时间戳。(个人理解)

二、时间戳的获取

  时间的获取有三种方式:Android中获取系统时间可以通过Java中Calendar类获取,java.util.date类实现,还有android中Time实现,分别使用如下方式:

        Long timeMillis = Calendar.getInstance().getTimeInMillis();

Long timeGetTime = new Date().getTime();

Long timecurrentTimeMillis = System.currentTimeMillis();

以上三种方式获取的都是当前时间的时间戳,所以三者的结果是相同的。特别提到的是,Calendar方法中除了用Calendar.getInstance().getTimeInMillis();获取,也可用Calendar.getInstance().getTime();获取,两者的不同可以参考一下http://www.iteye.com/problems/10232 ;

三、时间格式的转换

在程序设计中,往往使用时间戳来传递,但时间戳只是用来方便传递的工具,通过时间戳看不出正确的时间,所以时间的运用当然不可能是时间戳,下面就来说说,时间戳与时间的转换:
首先:时间如何转换成时间戳:
这里是将yyyy-MM-dd HH:mm:ss格式的时间转换成时间戳:
         String date = "2015-09-02 10:39:00";
//String 类型的时间格式
 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        ParsePosition parsePosition = new ParsePosition(0);
//这里ParsePosition 是指从哪个位置开始索引,具体意义可自行Google
        Date date = simpleDateFormat.parse(date,parsePosition);
        Long dateString = date.getTime();
        //这里的dateString 即为date对应的时间戳
然后是将时间戳转换为时间格式:
Date date = new Date(dateString );
//这里的dateString是时间戳
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//这里是将要转换的时间格式,可以任意指定时间格式;例如“yyyy年MM月dd日 HH时mm分ss秒”等
String result = format.format(date); 
//result即为想要时间戳对应的时间格式

这里对时间格式的转换并没有非常全面,http://blog.csdn.net/super_level/article/details/7789830这里推荐这个博客,基本将日期时间的所有问题都包含其中了,大家可以参考。

四、时间间隔问题

因为项目中用到的地方是聊天功能,所以设计到时间间隔,依次来分别显示时间格式,在这里贴出代码,原本也是在网上找的方法,只是在原有方法上完善了一些细节
    /**
     * 获取时间间隔
     * @param inputTime传入的时间格式必须类似于“yyyy-MM-dd HH:mm:ss”这样的格式
     * @return
     **/
    public static String getInterval(String inputTime) {
        if(inputTime.length()!=19){
            return inputTime;
        }
        String result= null;
        try {
            SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            ParsePosition pos = new ParsePosition(0);
            Date d1 = (Date) sd.parse(inputTime, pos);
            // 用现在距离1970年的时间间隔new
            // Date().getTime()减去以前的时间距离1970年的时间间隔d1.getTime()得出的就是以前的时间与现在时间的时间间隔
            long time = new Date().getTime() - d1.getTime();// 得出的时间间隔是毫秒
            if (time / 1000 <= 0 ) {
                // 如果时间间隔小于等于0秒则显示“刚刚”time/10得出的时间间隔的单位是秒
                result= "刚刚";
            } else if (time / 1000 < 60 ) {
                // 如果时间间隔小于60秒则显示多少秒前
                int se = (int) ((time % 60000) / 1000);
                result= se + "秒前";
            } else if (time / 60000 < 60 ) {
                // 如果时间间隔小于60分钟则显示多少分钟前
                int m = (int) ((time % 3600000) / 60000);// 得出的时间间隔的单位是分钟
                result= m + "分钟前";
            } else if (time / 3600000 < 24 ) {
                // 如果时间间隔小于24小时则显示多少小时前
                int h = (int) (time / 3600000);// 得出的时间间隔的单位是小时
                result= h + "小时前";
            }else if (time / 86400000 < 2 ) {
                // 如果时间间隔小于2天则显示昨天
                SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
                result= sdf.format(d1.getTime());
                result= "昨天" +result;
            }else if (time / 86400000 < 3 ) {
                // 如果时间间隔小于3天则显示前天
                SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
                result= sdf.format(d1.getTime());
                result= "前天" +result;
            }else if (time / 86400000 < 30 ) {
                // 如果时间间隔小于30天则显示多少天前
                SimpleDateFormat sdf = new SimpleDateFormat("MM月dd日 HH:mm");
                result= sdf.format(d1.getTime());
            } else if (time / 2592000000l < 12 ) {
                // 如果时间间隔小于12个月则显示多少月前
                SimpleDateFormat sdf = new SimpleDateFormat("MM月dd日");
                result= sdf.format(d1.getTime());


            }else {
//                // 大于1年,显示年月日时间
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
                result= sdf.format(d1.getTime());
            }
        } catch (Exception e) {
            return inputTime;
        }
        return result;
    }


第一次写博客,上述内容有些也是我自己总结的内容,其中如果有不对的地方,还望指正。



0 0