Java 安卓倒计时系统工作不正常,数字在2个值和时区之间闪烁不定

Java 安卓倒计时系统工作不正常,数字在2个值和时区之间闪烁不定,java,android,datetime,countdown,Java,Android,Datetime,Countdown,我有一个倒计时,倒计时到一个特定的日期。每次勾选(间隔1秒)都会更新一个文本框,其中显示事件发生前的天数/小时/分钟。我的问题是分钟数(还不知道天数/小时数)一直在闪烁。也就是说,在下降到16、17、16之前的一分钟内,它会说18、17、18、17,然后继续这样做 闪烁问题解决了,现在只是时区不起作用。(使用Pshemo的代码解决了闪烁问题) 而且时区似乎不起作用。它显示了2个多小时。已尝试使用SimpleTimeZone更改它,但它不起作用,仍然显示+2小时(无论SimpleTimeZone上

我有一个倒计时,倒计时到一个特定的日期。每次勾选(间隔1秒)都会更新一个文本框,其中显示事件发生前的天数/小时/分钟。我的问题是分钟数(还不知道天数/小时数)一直在闪烁。也就是说,在下降到16、17、16之前的一分钟内,它会说18、17、18、17,然后继续这样做

闪烁问题解决了,现在只是时区不起作用。(使用Pshemo的代码解决了闪烁问题)

而且时区似乎不起作用。它显示了2个多小时。已尝试使用SimpleTimeZone更改它,但它不起作用,仍然显示+2小时(无论SimpleTimeZone上的设置如何)

原因可能是什么

倒计时代码:

         new CountDownTimer(remaining, 1000) {
         TextView tv = (TextView)getActivity().findViewById(R.id.introTimeLeft);
         public void onTick(long millisUntilFinished) {         
             SimpleTimeZone ts = new SimpleTimeZone(2, "Middle Europe");

             Calendar cal = Calendar.getInstance(ts);
             cal.set(2012, 5, 28, 17, 0);
             long endTime = cal.getTimeInMillis(); 
             long currentTime = System.currentTimeMillis();
             long remaining = endTime - currentTime;

         tv.setText(getDurationBreakdown(remaining));
         }

         ...

      }.start();

public String getDurationBreakdown(long millis)
{
    if(millis < 0)
    {
        throw new IllegalArgumentException("Duration must be greater than zero!");
    }

    long days = TimeUnit.MILLISECONDS.toDays(millis);
    millis -= TimeUnit.DAYS.toMillis(days);

    long hours = TimeUnit.MILLISECONDS.toHours(millis);
    millis -= TimeUnit.HOURS.toMillis(hours);

    long minutes = (long) Math.ceil(TimeUnit.MILLISECONDS.toMinutes(millis));

    StringBuilder sb = new StringBuilder(64);
    sb.append(days);
    sb.append(" Days ");
    sb.append(hours);
    sb.append(" Hours ");
    sb.append(minutes);
    sb.append(" Minutes");

    return(sb.toString());
}
新倒计时(剩余,1000){
TextView tv=(TextView)getActivity().findViewById(R.id.introTimeLeft);
公共无效条(长毫秒直至完成){
SimpleTimeZone ts=新SimpleTimeZone(2,“中欧”);
Calendar cal=Calendar.getInstance(ts);
计算集(2012,5,28,17,0);
long-endTime=cal.getTimeInMillis();
长currentTime=System.currentTimeMillis();
剩余时间长=结束时间-当前时间;
tv.setText(getDuration细分(剩余));
}
...
}.start();
公共字符串getDurationBreakdown(长毫秒)
{
如果(毫秒<0)
{
抛出新的IllegalArgumentException(“持续时间必须大于零!”);
}
长日=时间单位。毫秒。今天(毫秒);
毫秒-=时间单位。天。托米利(天);
长时间=时间单位。毫秒。到小时(毫秒);
毫秒-=时间单位。小时。托米(小时);
long minutes=(long)Math.ceil(TimeUnit.millides.toMinutes(millis));
StringBuilder sb=新的StringBuilder(64);
某人(天);
某人附加(“天”);
某人(小时);
某人追加(“小时”);
某人追加(分钟);
某人附加(“会议记录”);
使(某人)返回字符串();
}

这只是胡乱猜测,但尝试它却毫无魅力

据我所见,您在同一个位置阅读了
currentTime
endTime

long endTime = cal.getTimeInMillis(); 
long currentTime = System.currentTimeMillis();
您也没有在calendar对象中指定毫秒,因此
cal.getTimeInMillis()
使用当前毫秒。所以你的代码

long remaining = endTime - currentTime;
有时等于值,如
183360000
,但有时也等于值,如
18299999
(取决于创建
endTime
currentTime
之间经过的毫秒数)

这可能导致1毫秒的计算错误,但在舍入后,也可能是1秒/分钟/小时/天(如果该值在下一毫秒内发生变化)


您可以通过只读取一次
endTime
,并在计算剩余
时只更新currentTime来解决此问题。我想您可能是从两个不同的位置更新文本视图。是否有其他类正在更新您的TextView?

这解决了闪烁问题。只读取一次endTime。时区问题仍然存在。@Patrick我还没有处理时区问题,但设法在google上搜索了->之类的东西,也许“在时区之间转换”会有所帮助。