说说最近项目中一个特别小的细节:日期转化。比如说游客在某个时间访问了主页,需要确定这个时间是今天,还是昨天,还是其他时间来访问的。
因为觉得这个特别常用,所以就写了个小demo,可以作为一个工具类使用。注释中做了详细说明。
/**
* @param time :2016-11-01 08:59:40
* @return
*/
private String parseTime(String time) {
//将当前日期转化为calendar:
Calendar currentCal = Calendar.getInstance();
Date nowDate = new Date(System.currentTimeMillis());
currentCal.setTime(nowDate);
//将source日期转化为calendar
Calendar sourceCal = Calendar.getInstance();
SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd");
Date sourceDate = null;
try {
sourceDate = formate.parse(time);
} catch (ParseException e) {
e.printStackTrace();
}
sourceCal.setTime(sourceDate);
if(currentCal.get(Calendar.YEAR)==sourceCal.get(Calendar.YEAR)){
//Calendar.DAY_OF_YEAR:day number within the current year.
// The first day of the year has value 1.
int days = currentCal.get(Calendar.DAY_OF_YEAR)-sourceCal.get(Calendar.DAY_OF_YEAR);
if(days==0){
return "今天";
} else if(days==1){
return "昨天";
}else{
return time;
}
}else{
return time;
}
}
现在来验证下日期:
private String[] timeList = {"2016-11-01 08:59:40","2016-10-31 08:59:40","2016-10-30 08:59:40"};
String time1 = parseTime(timeList[0]);
String time2 = parseTime(timeList[1]);
String time3 = parseTime(timeList[2]);
mTv1.setText(time1);
mTv2.setText(time2);
mTv3.setText(time3);
用三个textview展示3个解析过的时间,展示如下,已经能正确解析了。
再补充下:
有时候需求是如QQ聊天中的时间格式显示,这里借鉴环信demo中的时间处理:
//处理时间
public static String getTimestampString(Date var0) {
String var1 = null;
if(isThisYear(var0)){
long var2 = var0.getTime();
if(isSameDay(var2)) {
Calendar var4 = GregorianCalendar.getInstance();
var4.setTime(var0);
int var5 = var4.get(Calendar.HOUR_OF_DAY);
if(var5 > 17) {
var1 = "晚上 hh:mm";
} else if(var5 >= 0 && var5 <= 6) {
var1 = "凌晨 hh:mm";
} else if(var5 > 11 && var5 <= 17) {
var1 = "下午 hh:mm";
} else {
var1 = "上午 hh:mm";
}
} else if(isYesterday(var2)) {
var1 = "昨天 HH:mm";
} else {
var1 = "M月d日 HH:mm";
}
}else{
SimpleDateFormat formatter = new SimpleDateFormat( "yyyy年M月d日 HH:mm");
var1 = formatter.format(var0);//格式化数据
}
return (new SimpleDateFormat(var1, Locale.CHINA)).format(var0);
}
//判断是否是今年
public static boolean isThisYear(Date var0){
Calendar ca=Calendar.getInstance();
ca.setTime(new Date());
int year = ca.get(Calendar.YEAR);
Calendar ca1 =Calendar.getInstance();
ca1.setTime(var0);
int year1 = ca1.get(Calendar.YEAR);
if(year==year1){
return true;
}else{
return false;
}
}
//判断是否是同一天
private static boolean isSameDay(long var0) {
TimeInfo var2 = getTodayStartAndEndTime();
return var0 > var2.getStartTime() && var0 < var2.getEndTime();
}
//获取一天的开始时间和结束时间,封装到TimeInfo 类中。
public static TimeInfo getTodayStartAndEndTime() {
Calendar var0 = Calendar.getInstance();
var0.set(Calendar.HOUR_OF_DAY, 0);
var0.set(Calendar.MINUTE, 0);
var0.set(Calendar.SECOND, 0);
var0.set(Calendar.MILLISECOND, 0);
Date var1 = var0.getTime();
long var2 = var1.getTime();
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss S");
Calendar var5 = Calendar.getInstance();
var5.set(Calendar.HOUR_OF_DAY, 23);
var5.set(Calendar.MINUTE, 59);
var5.set(Calendar.SECOND, 59);
var5.set(Calendar.MILLISECOND, 999);
Date var6 = var5.getTime();
long var7 = var6.getTime();
TimeInfo var9 = new TimeInfo();
var9.setStartTime(var2);
var9.setEndTime(var7);
return var9;
}
public class TimeInfo {
private long startTime;
private long endTime;
public TimeInfo() {
}
public long getStartTime() {
return this.startTime;
}
public void setStartTime(long var1) {
this.startTime = var1;
}
public long getEndTime() {
return this.endTime;
}
public void setEndTime(long var1) {
this.endTime = var1;
}
}
通过以上,可以将时间很细节化的处理。不同项目的需求或许又会有所不同,有需要的可以鉴于以上再做相应修改。