Java:加速并减慢时间

时间:2013-05-14 02:31:13

标签: java java.util.date

我正在试图找出设置任意时间的逻辑,然后让它以不同的速度“回放”(例如.5x或4x实时)。

这是我到目前为止的逻辑,它将以正常速度播放时间:

import java.util.Calendar;


public class Clock {


    long delta;
    private float speed = 1f;

    public Clock(Calendar startingTime) {
        delta = System.currentTimeMillis()-startingTime.getTimeInMillis();
    }

    private Calendar adjustedTime() {
        Calendar cal = Calendar.getInstance();

        cal.setTimeInMillis(System.currentTimeMillis()-delta);

        return cal;

    }

    public void setPlaybackSpeed(float speed){
        this.speed  = speed;
    }

    public static void main(String[] args){


        Calendar calendar = Calendar.getInstance();
        calendar.set(2010, 4, 4, 4, 4, 4);
        Clock clock = new Clock(calendar);

        while(true){
            System.out.println(clock.adjustedTime().getTime());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }


}

我无法确定逻辑中需要使用“速度”属性的位置。

1 个答案:

答案 0 :(得分:2)

以下代码举例说明了如何设计这样一个时钟,其内部状态为double sppedlong startTime。它公开了一个发布方法getTime(),它将返回自1970年1月1日午夜以来的调整时间(以毫秒为单位)。请注意,调整发生在startTime之后。

计算调整时间的公式很简单。首先通过currentTimeMillis()减去startTime,然后将此值乘以speed以获得调整后的时间值,然后将其添加到startTime以获得结果,从而获取实时时间值。< / p>

public class VariableSpeedClock {

    private double speed;
    private long startTime;

    public VariableSpeedClock(double speed) {
        this(speed, System.currentTimeMillis());
    }

    public VariableSpeedClock(double speed, long startTime) {
        this.speed = speed;
        this.startTime = startTime;
    }

    public long getTime () {
        return (long) ((System.currentTimeMillis() - this.startTime) * this.speed + this.startTime);
    }

    public static void main(String [] args) throws InterruptedException {

        long st = System.currentTimeMillis();
        VariableSpeedClock vsc = new VariableSpeedClock(2.3);

        Thread.sleep(1000);

        System.out.println(vsc.getTime() - st);
        System.out.println(System.currentTimeMillis() - st);

    }
}