我想从 ebay 解析一个倒数计时器
<span id="vi-cdown_timeLeft" class="">5g 20h </span>
我如何用jsoup解析它以在android studio上创建一个倒数计时器?
我可以像普通的元素
一样解析它吗?如下图
更新: getMsFromString 与下面从 shn android dev 编写的方法相同
public synchronized void getTimer() {
new Thread(new Runnable() {
@Override
public void run() {
try {
sem.acquire();
Document doc = Jsoup.connect(linkurl).get();
remaining = doc.select("#vi-cdown_timeLeft").first().text();
msFromString = getMsFromString(remaining);
long remainingMs = System.currentTimeMillis() - msFromString;
new CountDownTimer(remainingMs, 1000) {
public void onTick(long millisUntilFinished) {
timer.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
timer.setText("done!");
}
}.start();
sem.release();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
最佳答案
因此,与倒数计时器相关的 ebay 网页的 HTML 部分如下所示:
<span class="vi-tm-left">
<span class="timeMs" timems="1522415936000">Friday, 8:18AM</span>
</span>
您想获取具有“timems”属性 的span
元素 的值。请注意,timems
是自 1970 年 1 月 1 日以来经过的毫秒数。
在您的 JSoup 中尝试执行以下代码以获取 timems
的值(您需要将 URL 更改为您的 eBay 出价所在的位置!):
Document doc = Jsoup.connect("http://myebayurl.com/").get();
Element timeSpanEle = doc.select("span.timeMs").first();
long timeMs = Long.parseLong(timeSpanEle.attr("timems"));
现在我们有了 Unix 时间戳的值(以毫秒为单位,而不是秒!)指示拍卖何时到期。现在我们需要在 Android Studio 上制作一个倒数计时器。我们可以使用 android.os.CountDownTimer
来执行此操作,因为您尚未指定要使用的类(但是这应该让您了解如何执行此操作)。
long remainingMs = System.currentTimeMillis() - timeMs;
new CountDownTimer(remainingMs, 1000) {
public void onTick(long millisUntilFinished) {
mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
mTextField.setText("done!");
}
}.start();
编辑:原来帖子中的内容发生了一点变化。根据您的说法,带有拍卖剩余时间的 HTML 不是 UNIX 时间戳,而是一个字符串值,因此前面的答案对您不起作用。这是因为意大利版的 Ebay 网站(OP 正在使用的那个)不同于美国版(我错误地认为 OP 正在使用的那个版本)。这是更新后的答案。
鉴于您要处理的时间采用以下格式而不是 UNIX 时间戳:
Xg Yh Zm
其中 X 是天数 (g),Y 是小时数 (h),Z 是分钟数 (m)。
我们通过以下方式获取剩余时间的值:
Document doc = Jsoup.connect("http://myebayurl.com/").get();
String remaining = doc.select("#vi-cdown_timeLeft").first().text();
我们现在需要解析这个字符串并将其转换为 ms 剩余。从上面取出时间剩余的String,用下面的静态方法解析成ms:
public static long getMsFromString(String str) {
String[] arr = str.split(" ");
long auctionTimeLeft = 0;
for(String s : arr){
if(s.contains("g")) { //convert days to milliseconds
auctionTimeLeft += Long.parseLong(s.substring(0, s.indexOf("g"))) * 8.64e7;
}
else if(s.contains("h")){ //convert hours to milliseconds
auctionTimeLeft += Long.parseLong(s.substring(0, s.indexOf("h"))) * 3.6e6;
}
else if(s.contains("m")){ //convert minutes to milliseconds
auctionTimeLeft += Long.parseLong(s.substring(0, s.indexOf("m"))) * 60000;
}
}
return auctionTimeLeft;
}
结论
- 从 ebay 获取剩余拍卖时间字符串(即“3g 10h 5m”)
- 对第一步中的字符串调用
getMsFromString
- 在倒数计时器中使用步骤 2 中剩余的毫秒数(上例中的 remainingMs)
关于java - 使用 jsoup 收集倒数计时器并为 android 设置一个计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49565617/