最近做的项目中,聊天界面设计到时间格式的问题,因为以前没有仔细研究过时间格式以及时间差的问题,所以把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 ;
三、时间格式的转换
ParsePosition parsePosition = new ParsePosition(0);
Date date = simpleDateFormat.parse(date,parsePosition);
Long dateString = date.getTime();
//这里的dateString 即为date对应的时间戳
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//这里是将要转换的时间格式,可以任意指定时间格式;例如“yyyy年MM月dd日 HH时mm分ss秒”等
四、时间间隔问题
* 获取时间间隔
* @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;
}
第一次写博客,上述内容有些也是我自己总结的内容,其中如果有不对的地方,还望指正。