首先是一个自定义控件:

public class RushBuyCountDownTimerView extends LinearLayout {

    // 小时,十位
private TextView tv_hour_decade;
// 小时,个位
private TextView tv_hour_unit;
// 分钟,十位
private TextView tv_min_decade;
// 分钟,个位
private TextView tv_min_unit;
// 秒,十位
private TextView tv_sec_decade;
// 秒,个位
private TextView tv_sec_unit; private Context context; private int hour_decade;
private int hour_unit;
private int min_decade;
private int min_unit;
private int sec_decade;
private int sec_unit;
// 计时器
private Timer timer; private Handler handler = new Handler() { public void handleMessage(Message msg) {
countDown();
} ;
}; public RushBuyCountDownTimerView(Context context, AttributeSet attrs) {
super(context, attrs); this.context = context;
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.view_countdowntimer, this); tv_hour_decade = (TextView) view.findViewById(R.id.tv_hour_decade);
tv_hour_unit = (TextView) view.findViewById(R.id.tv_hour_unit);
tv_min_decade = (TextView) view.findViewById(R.id.tv_min_decade);
tv_min_unit = (TextView) view.findViewById(R.id.tv_min_unit);
tv_sec_decade = (TextView) view.findViewById(R.id.tv_sec_decade);
tv_sec_unit = (TextView) view.findViewById(R.id.tv_sec_unit); } /**
* @param
* @return void
* @throws
* @Description: 开始计时
*/
public void start() { if (timer == null) {
timer = new Timer();
timer.schedule(new TimerTask() { @Override
public void run() {
handler.sendEmptyMessage(0);
}
}, 0, 1000);
}
} /**
* @param
* @return void
* @throws
* @Description: 停止计时
*/
public void stop() {
if (timer != null) {
timer.cancel();
timer = null;
tv_hour_decade.setText(0 + "");
tv_hour_unit.setText(0 + "");
tv_min_decade.setText(0 + "");
tv_min_unit.setText(0 + "");
tv_sec_decade.setText(0 + "");
tv_sec_unit.setText(0 + "");
}
} /**
* @param
* @return void
* @throws Exception
* @throws
* @Description: 设置倒计时的时长
*/
public void setTime(String hour, String min, String sec) { int Hour = Integer.parseInt(hour);
int Min = Integer.parseInt(min);
int Second = Integer.parseInt(sec); if (Hour >= 120 || Min >= 60 || Second >= 60 || Hour < 0 || Min < 0
|| Second < 0) {
throw new RuntimeException("error:check your time");
} hour_decade = Hour / 10;
hour_unit = Hour - hour_decade * 10; min_decade = Min / 10;
min_unit = Min - min_decade * 10; sec_decade = Second / 10;
sec_unit = Second - sec_decade * 10; tv_hour_decade.setText(hour_decade + "");
tv_hour_unit.setText(hour_unit + "");
tv_min_decade.setText(min_decade + "");
tv_min_unit.setText(min_unit + "");
tv_sec_decade.setText(sec_decade + "");
tv_sec_unit.setText(sec_unit + ""); } /**
* @param
* @return boolean
* @throws
* @Description: 倒计时
*/
private void countDown() { if (isCarry4Unit(tv_sec_unit)) {
if (isCarry4Decade(tv_sec_decade)) { if (isCarry4Unit(tv_min_unit)) {
if (isCarry4Decade(tv_min_decade)) { if (isCarry4Unit(tv_hour_unit)) {
if (isCarry4Decade(tv_hour_decade)) {
// ToastUtil.safeShowToast(TLApplication.mContext, "Time limited");
stop();
}
}
}
}
}
}
} /**
* @param
* @return boolean
* @throws
* @Description: 变化十位,并判断是否需要进位
*/
private boolean isCarry4Decade(TextView tv) { int time = Integer.valueOf(tv.getText().toString());
time = time - 1;
if (time < 0) {
time = 5;
tv.setText(time + "");
return true;
} else {
tv.setText(time + "");
return false;
} } /**
* @param
* @return boolean
* @throws
* @Description: 变化个位,并判断是否需要进位
*/
private boolean isCarry4Unit(TextView tv) { int time = Integer.valueOf(tv.getText().toString());
time = time - 1;
if (time < 0) {
time = 9;
tv.setText(time + "");
return true;
} else {
tv.setText(time + "");
return false;
} }
}
view_countdowntimer.xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#FF0000"
android:padding="5dp"> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="倒计时:"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/tv_hour_decade"
style="@style/RushBuyCountDownTimerViewStyle" /> <TextView
android:id="@+id/tv_hour_unit"
style="@style/RushBuyCountDownTimerViewStyle"
android:layout_marginLeft="1dp" /> <TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="时"
android:textColor="#FFFFFF"
android:textSize="16sp" /> <TextView
android:id="@+id/tv_min_decade"
style="@style/RushBuyCountDownTimerViewStyle" /> <TextView
android:id="@+id/tv_min_unit"
style="@style/RushBuyCountDownTimerViewStyle"
android:layout_marginLeft="1dp" /> <TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="分"
android:textColor="#FFFFFF"
android:textSize="16sp" /> <TextView
android:id="@+id/tv_sec_decade"
style="@style/RushBuyCountDownTimerViewStyle" /> <TextView
android:id="@+id/tv_sec_unit"
style="@style/RushBuyCountDownTimerViewStyle"
android:layout_marginLeft="1dp" /> <TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="秒"
android:textColor="#FFFFFF"
android:textSize="16sp" /> </LinearLayout> </FrameLayout>
RushBuyCountDownTimerViewStyle:
<style name="RushBuyCountDownTimerViewStyle">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:gravity">center</item>
<item name="android:text">0</item>
<item name="android:textColor">#FFFFFF</item>
<item name="android:textSize">16sp</item>

可能用到的时间格式转换工具:

/** 将格林威治时间格式转为指定的时间格式 */
public static String GTMToLocal(String GTMDate) { int tIndex = GTMDate.indexOf("T");
String dateTemp = GTMDate.substring(0, tIndex);
String timeTemp = GTMDate.substring(tIndex + 1, GTMDate.length() - 6);
String convertString = dateTemp + " " + timeTemp; SimpleDateFormat format;
format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
Date result_date;
long result_time = 0; if (null == GTMDate) {
return GTMDate;
} else {
try {
format.setTimeZone(TimeZone.getTimeZone("GMT00:00"));
result_date = format.parse(convertString);
result_time = result_date.getTime();
format.setTimeZone(TimeZone.getDefault());
return format.format(result_time);
} catch (Exception e) {
e.printStackTrace();
}
}
return GTMDate; }

设置倒计时:

String startTime = StringUtil.GTMToLocal("2015-12-28T12:49:13.45425+08:00");
String endTime = StringUtil.GTMToLocal("2015-12-31T00:17:13.45425+08:00"); DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try {
Date d1 = df.parse(startTime);
Date d2 = df.parse(endTime);
long diff = d2.getTime() - d1.getTime(); // mslong days = diff / (1000 * 60 * 60 * 24);
long hours = (diff - days * (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
long minutes = (diff - days * (1000 * 60 * 60 * 24) - hours * (1000 * 60 * 60)) / (1000 * 60);
long second = (diff / 1000 - days * 24 * 60 * 60 - hours * 60 * 60 - minutes * 60); hours += days * 24; // RushBuyCountDownTimerView timerView; 需要初始化timerView

            timerView.setTime(hours + "", minutes + "", second + "");
timerView.start(); } catch (Exception e) {
e.printStackTrace();
}

Android倒计时:计算两个时间将得到的时间差转化为倒计时(xx时xx分xx秒格式)的更多相关文章

  1. SQL语句更新时间字段的年份、月份、天数、时、分、秒

    SQL语句更新时间字段的年份.月份.天数.时.分.秒 --修改d表日期字段的年份update dset birth=STUFF(convert(nvarchar(23),birth,120),1,4, ...

  2. Android之计算两个时间的相差

    参数:   sdate = 2013-07-16 16:14:47 /** * 以友好的方式显示时间 * @param sdate * @return */ public static String ...

  3. java获取两个时间的相隔时间,包括年、月、日、时、分、秒

    public static final int YEAR_RETURN = 0;                    public static final int MONTH_RETURN = 1 ...

  4. javascript 以“年-月-日 时:分:秒”格式显示当前时间

    运行代码 /** * Created by shgbit on 2015/1/9. *js代码 */ function showNow(){ var t=new Date();    var mont ...

  5. Java 获取各时区时间,获取当前时间到格林威治时间1970年01月01日00时00分00秒的秒数

    格林威治时间即UTC/GMT时间,1970年01月01日00时00分00秒(即UTC+8的北京时间1970年01月01日08时00分00秒)计算代码如下: /** * 获取指定时间到格林威治时间的秒数 ...

  6. C#计算两个时间年份月份差

    C#计算两个时间年份月份差 https://blog.csdn.net/u011127019/article/details/79142612

  7. oracle计算两个时间的差值(XX天XX时XX分XX秒)

    在工作中需要计算两个时间的差值,结束时间 - 开始时间,又不想在js里写function,也不想在java里去计算,干脆就在数据库做了一个函数来计算两个时间的差值.格式为XX天XX时XX分XX秒: 上 ...

  8. 使用LocalDateTime计算两个时间的差

    LocalDateTime now = LocalDateTime.now();System.out.println("计算两个时间的差:");LocalDateTime end ...

  9. Python datetime库计算两个时间点之间的分钟(秒、天)数

    计算两个时间点之间的分钟数 import datetime def minNums(startTime, endTime): '''计算两个时间点之间的分钟数''' # 处理格式,加上秒位 start ...

随机推荐

  1. Backbone的一点使用心得

    Backbone的其实感觉上上手很难,大概在一年前就想实践下,结果总是没有付诸行动,这次需求中狠狠心决定一定要使用一次看看,感受下. 可是第一步真的比较困难,因为直接看API好像没有感觉就在网上找实例 ...

  2. PDA项目介绍

    开发工具:Microsoft Visual Studio 2008 SDK:      Windows Mobile 6 SDK 数据库:     Oracle 开发语言:C#(3.5) 版本控制工具 ...

  3. 硬件抽象层:HAL

    本节我们研究硬件抽象层:HALHAL,它是建立在Linux驱动之上的一套程序库.刚开始介绍了为什么要在Android中加入HAL,目的有三个,一,统一硬件的调用接口.二,解决了GPL版权问题.三,针对 ...

  4. java培训第一天--画板

    package day1; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt ...

  5. 6、Concurrent-Mark-Sweep

    1.cms 主要用于年老代垃圾回收 2.这玩意牺牲通吐量换取最短垃圾回收时间 3.有的地方说是四个阶段,有的地方说五个阶段,还有六个阶段的,真相是----我也不知道 四个阶段: Initial mar ...

  6. Read excel and put cell data into HashMap

    //Read excel row by row, put cell name and cell value to a map for each row. HashMap getExpectedResu ...

  7. Httpclient请求数据

    package com.baidu.myutils; import java.io.IOException; import org.apache.http.HttpEntity; import org ...

  8. [DNS][转]EDNS

    随着业务的复杂化和多样化,RFC1035中定义的DNS消息格式和它支持的消息内容已经不足以满足一些DNS服务器的需求,于是,RFC2671 中提出了一种扩展DNS机制EDNS(Extension Me ...

  9. zookeeper+dubbo-admin开发dubbo应用

    前面的章节中我们已经安装好了zookeeper,tomcat了.今天我们来实现一个完整的从dubbo消息产生到消费的完整流程. 1.dubbo api 2.dubbo consumer 消费者 3.d ...

  10. 官网app下载更换成微信公众号二维码 测试

    微信现在很火啊.公司官网原先提供的ios和andriod的app下载链接要求切换成微信公众号二维码.简单的替换,大家都说不需要测试直接上线.还是测了下. 1 验证所有与下载相关的信息都已去除. 包括下 ...