【问题标题】:How to set Android Chronometer base time from Date object?如何从 Date 对象设置 Android Chronometer 基准时间?
【发布时间】:2012-06-02 13:54:39
【问题描述】:

我在从特定时间启动计时器时遇到了问题。 我希望我的计时器从一个 Date 对象开始:

Date d = new Date(); //now, just for example
chronometer.setBase(d.getTime()); //long value of d
Log.d("Date: " , "d.getTime() time is [" + d.getTime() +"]");
Log.d("Chron: " , "chronometer.getBase() is [" + chronometer.getBase() +"]");
//let's print out elapsedRealtime from official sample
Log.d("Chron: " , "SystemClock.elapsedRealtime() is [" + SystemClock.elapsedRealtime() +"]");

输出:

06-02 13:35:23.025: D/Date:(928): d.getTime() time is [1338644123032]
06-02 13:35:23.037: D/Chron:(928): chronometer.getBase() is [1338644123032]
06-02 13:35:23.037: D/Chron:(928): SystemClock.elapsedRealtime() is [11624388]

实际上,为什么这么长的时间值不同(11624388 和 1338644123032)?

当我从底座启动我的计时器时

chronometer.setBase(SystemClock.elapsedRealtime());

- 它总是工作正常(“00:00”和上升)

但是当我尝试从过去的日期(例如昨天)设置日期时:

chronometer.setBase(yesterday.getTime());

- 它显示“00:0(”并每秒将最新的字符更改为“)”、“*”、“/”等

您能否告知我如何将计时器底座设置为 Date 对象?

【问题讨论】:

    标签: android chronometer


    【解决方案1】:

    我实际上遇到了类似的问题(日期来自外部服务,而不是数据库),我想显示日期的年龄。

    事实证明很简单:

    long lastSuccess = serviceDate.getTime(); //Some Date object
    long elapsedRealtimeOffset = System.currentTimeMillis() - SystemClock.elapsedRealtime();
    pollAgeView.setBase(lastSuccess - elapsedRealtimeOffset);
    pollAgeView.start();
    

    【讨论】:

    • 这是一种比重写Chronometer 接受Date 更合理的方法,并且比当前接受的答案更好地回答问题。
    • 这不是一个好主意,因为用户可以从您的设备更改日期。那么如何在不使用系统基准时间的情况下从服务器中确定一个真实的日期时间呢?
    【解决方案2】:

    实际上,为什么这么长的时间值不同(11624388 和 1338644123032)?

    SystemClock.elapsedRealtime() 是设备开启后的毫秒数。其他值基于System.currentTimeMillis(),即自 Unix 纪元以来的毫秒数。

    您能否告知我如何将计时器底座设置为 Date 对象?

    你没有。这不是Chronometer 的用途。引用the documentation for Chronometer:

    你可以在 elapsedRealtime() 时基中给它一个开始时间,它会从那个开始计数,或者如果你不给它一个基准时间,它会使用你调用 start() 的时间。

    【讨论】:

    • 谢谢马克。我的目标是创建一个数字时钟,显示两个活动之间的持续时间(与时间记录一起存储在数据库中)。您能否为此提供最佳实践建议?
    • @Vitalliuss:如果您的开始时间和结束时间在数据库中都是固定的,那么只需使用TextView,因为您的值不会改变。如果您的开始时间在数据库中是固定的,并且您从那里开始计数,您将需要创建自己的 Chronometer 等效项,它在 System.currentTimeMillis() 时基中使用开始时间,而不是 elapsedRealtime()。由于Chronometer is not a very long class,克隆它并制作自己的应该相当容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多