在天文台中,我们如何提取经过的时间并将其分别存储在变量中。
例如,存储单独的int变量中经过的小时数,分钟数,秒数?
有可能吗?如果是,如何?
除了天文台表,使用其他概念可以做得更好吗?如果是,那是什么?
答案 0 :(得分:14)
您可以获取时间值(以毫秒为单位):
long timeElapsed = SystemClock.elapsedRealtime() - chrono.getBase();
然后您可以按如下方式检索小时,分钟和秒:
long timeElapsed = 7564000; //For example
int hours = (int) (timeElapsed / 3600000);
int minutes = (int) (timeElapsed - hours * 3600000) / 60000;
int seconds = (int) (timeElapsed - hours * 3600000 - minutes * 60000) / 1000;
//hours = 2
//minutes = 6
//seconds = 4
答案 1 :(得分:3)
一些想法突然出现在我身上:
getText()
并使用每个":"
(或任何本地时间分隔符)解析时间。您还可以自己计算当前时间(以毫秒为单位),将其传递给Java Calendar对象并使用get()
方法:
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
calendar.setTimeInMillis(SystemClock.elapsedRealtime() - chronometer.getBase());
int hour = calendar.get(Calendar.HOUR_OF_DAY);
// etc
答案 2 :(得分:-1)
你也可以创建自己的Chronometer,这是我用作倒数计时器的一个例子,但是反过来的想法是相同的,你应该只需要更改CountQueue CountDownTimer来添加分钟和小时而不是减去它们,更改@Override onTick以将iSec存储为60减去当前值并更改“void setTimeText()”,但是要显示值。 setTrainingCountdown()也应该改变,所以它默认从0开始。
要使用它,您只需在创建新的SkillQCountdown时绑定任何TextView,然后使用setTrainingCountdown()启动它,您可能想要创建一种暂停和重新启动计时器的方法(只需停止计时器并存储值,然后重新启动储值)。 如果您想存储并显示毫秒数,请更改此行“counter = new CountQueue(60000,100);”因此,您可以每秒注册onTick而不是每60秒注册一次,第二个值是它尝试使用新值更新TextView的频率。
但是,如果您只想精确存储值,则可以在计数开始时以毫秒为单位获取当前时间,并在需要获取值时,然后减去该值并计算秒,分和小时相同正如你所看到的那样是在“public void setTrainingCountdown(long diffInMis)”
中完成的public class SkillQCountdown {
int iDay,iHour,iMin,iSec;
CountQueue counter;
NumberFormat myFormat = NumberFormat.getInstance();
Context mContext;
private TextView text = null;
public SkillQCountdown(Context context, TextView text){
mContext = context;
this.text = text;
}
public void setTrainingCountdown(long diffInMis) {
myFormat.setMinimumIntegerDigits(2);
try {
if(diffInMis < 0) {
Toast.makeText(mContext, "Skill Queue unsynchronized"
,Toast.LENGTH_SHORT).show();
}else {
long diff = TimeUnit.MILLISECONDS.toSeconds(diffInMis);
iDay = (int) (diff/(60*60*24));
long lday = (diff%(60*60*24));
iHour = (int)(lday/3600);
long lhour = (lday%(60*60));
iMin = (int)(lhour/60);
long lmin= (lhour%(60));
iSec = (int)(lmin);
setTimeText();
counter = new CountQueue(iSec*1000, 100);
counter.start();}
} catch (ParseException e) {
e.printStackTrace();
}
}
private void setTimeText() {
StringBuilder sb = new StringBuilder();
String strText = null;
if (iDay > 0) {
sb.append(myFormat.format(iDay));
if (iDay == 1) {
sb.append(" day ");
}else {
sb.append(" days ");
}
}
if (iHour > 0 || iDay > 0) {
sb.append(myFormat.format(iHour));
if (iHour == 1) {
sb.append(" hour ");
}else {
sb.append(" hours ");
}
}
if (iMin > 0 || iHour > 0 || iDay > 0) {
sb.append(myFormat.format(iMin));
if (iMin == 1) {
sb.append(" minute ");
}else {
sb.append(" minutes ");
}
}
if (iSec > 0 || iMin > 0 || iHour > 0 || iDay > 0) {
sb.append(myFormat.format(iSec));
sb.append(" seconds");
strText = sb.substring(0);
}else {
strText = mContext.getString(R.string.msg_skillQueueEmpty);
}
text.setText(strText);
}
private class CountQueue extends CountDownTimer{
public CountQueue(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
iSec = 0;
setTimeText();
counter = new CountQueue(60000, 100);
counter.start();
iMin-=1;
if(iMin < 0 && (iHour > 0 || iDay > 0)) {
iMin=59;
iHour-=1;
if(iHour < 0 && iDay > 0) {
iHour=23;
iDay-=1;
}
}
}
@Override
public void onTick(long millisUntilFinished) {
if (Math.floor((float)millisUntilFinished / 1000.0f) != iSec) {
iSec = (int) Math.floor((float)millisUntilFinished / 1000.0f);
setTimeText();
}
}
}
}