/**
* 汇丰外汇汇率查询工具
* @author june
*/
public class HSBCRateUtil{
/** 美元兑人民币汇率 */
private static final String HSBC_RATE_USD = "USD";
/** 连接超时时间 */
private static final int CONNECT_TIME_OUT = 5 * 1000;
/** 汇丰汇率DOM 节点 */
private static final String HSBC_RATE_DOM = "tr.hsbcTableRow03";
/** 汇丰汇率更新时间DOM 节点 */
private static final String HSBC_RATE_UPDATE_TIME_DOM = "td.ForTime01";
/** 美元兑人民币最高汇率 */
public static final String USD_CNY_MAX_RATE = "USD_CNY_MAX_RATE";
/** 汇率更新时间 */
public static final String RATE_UPDATE_TIME = "RATE_UPDATE_TIME";
/** 汇率更新成功标识 */
public static final String RATE_UPDATE_SUCCESS = "RATE_UPDATE_SUCCESS";
/** 汇丰外汇汇率查询地址 */
private static final String FX_RATE_HSBC_URL = "http://www.hsbc.com.cn/1/2/misc-cn/exchange-rates/";
/**
* 私有化
*/
private HSBCRateUtil(){
}
/**
* 根据URL获取Dom树
* @param url
* @return
* @throws IOException
*/
private static Document request(String url) throws IOException{
Document document = Jsoup.connect(url)
.timeout(CONNECT_TIME_OUT)
.post();
return document;
}
/**
* 获取当时最高汇率
* @return
* @throws IOException
*/
public static HashMap<String, Object> getUSDMaxRate(){
//最高的汇率值
double maxRate = 0;
//是否更新成
boolean success = true;
//汇率更新时间
String updateTime = null;
try {
//获取dom树
Document document = request(FX_RATE_HSBC_URL);
if(null != document){
//汇率更新时间
updateTime = getUpdateTime(document);
//最高的汇率值
maxRate = getMaxRate(document, HSBC_RATE_USD);
if(maxRate <= 0){
success = false;
}
}
} catch (IOException e) {
e.printStackTrace();
success = false;
}
//返回结果
HashMap<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put(USD_CNY_MAX_RATE, maxRate);
resultMap.put(RATE_UPDATE_TIME, updateTime);
resultMap.put(RATE_UPDATE_SUCCESS, success);
return resultMap;
}
/**
* 获取汇率的更新时间
* @param document
* @return
*/
private static String getUpdateTime(Document document){
//汇率更新时间
String updateTime = null;
//获取汇丰汇率DOM 节点
Elements elements = document.select(HSBC_RATE_UPDATE_TIME_DOM);
if(null != elements && elements.size() > 0){
updateTime = elements.first().text();
if(!StringUtils.isEmpty(updateTime)){
int yearIndex = updateTime.indexOf("年");
updateTime = updateTime.substring(yearIndex - 4);
int startHour = updateTime.indexOf("午");
int endHour = updateTime.indexOf("点");
String hour12 = updateTime.substring(startHour+1, endHour);
String hour24 = hour12;
if(updateTime.contains("下午")){
hour24 = String.valueOf(24-Integer.parseInt(hour12));
updateTime = updateTime.replace("下午", "");
}else{
updateTime = updateTime.replace("上午", "");
}
updateTime = updateTime
.replace("年", "-")
.replace("月", "-")
.replace("日", "")
.replace(hour12+"点", hour24+":")
.replace("分", ":")
.replace("秒", "");
}
}
return updateTime;
}
/**
* 获取最高的汇率值
* @param document
* @param currency
* @return
*/
private static double getMaxRate(Document document, String currency){
//最高的汇率值
double maxRate = 0;
//获取汇丰汇率DOM 节点
Elements elements = document.select(HSBC_RATE_DOM);
if(null == elements) return 0;
for(Element element : elements){
//过滤出美元的dom节点
String text = element.text();
if(!StringUtils.isEmpty(text) && text.contains(HSBC_RATE_USD)){
List<Element> tds = element.children();
if(null != tds){
for(Element td : tds){
String value = td.text();
//获取美元现有的不同报价
if(!StringUtils.isEmpty(value) && !value.contains(currency)){
double rate = Double.parseDouble(value.trim());
if(maxRate < rate){
maxRate = rate;
}
}
}
}
break;
}
}
return maxRate;
}
}