package com.tencent.weibo.utils;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
/**
* 字符串处理相关的工具类
*/
public class QStrOperate {
// 禁止调用构造方法
private QStrOperate() {
}
/**
* 检查字符串是否存在值
*
* @param str 待检验的字符串
* @return 当 str 不为 null 或 "" 就返回 true
*/
public static boolean hasValue(String str) {
return (str != null && !"".equals(str));
}
/**
* 对参数进行UTF-8编码,并替换特殊字符
*
* @param paramDecString 待编码的参数字符串
* @return 完成编码转换的字符串
*/
public static String paramEncode(String paramDecString) {
if (!hasValue(paramDecString)) {
return "";
}
try {
return URLEncoder.encode(paramDecString, "UTF-8").replace("+", "%20")
.replace("*", "%2A").replace("%7E", "~")
.replace("#", "%23");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 将 %XX 换为原符号,并进行UTF-8反编码
*
* @param paramEncString 待反编码的参数字符串
* @return 未进行UTF-8编码和字符替换的字符串
*/
public static String ParamDecode(String paramEncString) {
int nCount = 0;
for (int i = 0; i < paramEncString.length(); i++) {
if (paramEncString.charAt(i) == '%') {
i += 2;
}
nCount++;
}
byte[] sb = new byte[nCount];
for (int i = 0, index = 0; i < paramEncString.length(); i++) {
if (paramEncString.charAt(i) != '%') {
sb[index++] = (byte) paramEncString.charAt(i);
} else {
StringBuilder sChar = new StringBuilder();
sChar.append(paramEncString.charAt(i + 1));
sChar.append(paramEncString.charAt(i + 2));
sb[index++] = Integer.valueOf(sChar.toString(), 16).byteValue();
i += 2;
}
}
String decode = "";
try {
decode = new String(sb, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return decode;
}
/**
* 分割queryString,取得List<NameValuePair>格式存储的参数队列.
*
* @param queryString 查询字符串
* @return 以List<NameValuePair>格式存储的参数队列.
*/
public static List<NameValuePair> getQueryParamsList(String queryString) {
if (queryString.startsWith("?")) {
queryString = queryString.substring(1);
}
List<NameValuePair> result = new ArrayList<NameValuePair>();
if (queryString != null && !queryString.equals("")) {
String[] p = queryString.split("&");
for (String s : p) {
if (s != null && !s.equals("")) {
if (s.indexOf('=') > -1) {
String[] temp = s.split("=");
if (temp.length > 1) {
result.add(new BasicNameValuePair(temp[0], ParamDecode(temp[1])));
}
}
}
}
}
return result;
}
/**
* 根据List<NameValuePair>格式存储的参数队列,生成queryString
* @param QueryParamsList
* @return 不包括?的queryString
*/
public static String getQueryString(List<NameValuePair> QueryParamsList){
StringBuilder queryString=new StringBuilder();
for(NameValuePair param:QueryParamsList){
queryString.append('&');
queryString.append(param.getName());
queryString.append('=');
queryString.append(paramEncode(param.getValue()));
}
//去掉第一个&号
return queryString.toString().substring(1);
}
/**
* 根据 timestamp 生成各类时间状态串
*
* @param timestamp 距1970 00:00:00 GMT的秒数
* @return 时间状态串(如:刚刚5分钟前)
*/
public static String getTimeState(String timestamp) {
if (timestamp == null || "".equals(timestamp)) {
return "";
}
try {
long _timestamp = Long.parseLong(timestamp) * 1000;
if (System.currentTimeMillis() - _timestamp < 1 * 60 * 1000) {
return "刚刚";
} else if (System.currentTimeMillis() - _timestamp < 30 * 60 * 1000) {
return ((System.currentTimeMillis() - _timestamp) / 1000 / 60)
+ "分钟前";
} else {
Calendar now = Calendar.getInstance();
Calendar c = Calendar.getInstance();
c.setTimeInMillis(_timestamp);
if (c.get(Calendar.YEAR) == now.get(Calendar.YEAR)
&& c.get(Calendar.MONTH) == now.get(Calendar.MONTH)
&& c.get(Calendar.DATE) == now.get(Calendar.DATE)) {
SimpleDateFormat sdf = new SimpleDateFormat("今天 HH:mm");
return sdf.format(c.getTime());
}
if (c.get(Calendar.YEAR) == now.get(Calendar.YEAR)
&& c.get(Calendar.MONTH) == now.get(Calendar.MONTH)
&& c.get(Calendar.DATE) == now.get(Calendar.DATE) - 1) {
SimpleDateFormat sdf = new SimpleDateFormat("昨天 HH:mm");
return sdf.format(c.getTime());
} else if (c.get(Calendar.YEAR) == now.get(Calendar.YEAR)) {
SimpleDateFormat sdf = new SimpleDateFormat("M月d日 HH:mm:ss");
return sdf.format(c.getTime());
} else {
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy年M月d日 HH:mm:ss");
return sdf.format(c.getTime());
}
}
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
}