java - 单击两次按钮的持续时间返回错误值

标签 java android date buttonclick milliseconds

我正在尝试通过在用户休息之前单击并在完成休息时单击另一个按钮来计算用户所花费的休息时间。我偶然发现了几个问题,并了解到最好的方法是使用 nanoTime() 方法。

System.nanoTime();

但问题是当我计算持续时间时它返回奇怪的值。

Screenshot

这是我的代码,

        btnStartBreak.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                breakStartTime = System.nanoTime();
                breakTv.setText("Do you want to finish the break?");
                btnStartBreak.setVisibility(View.GONE);
                btnFinishBreak.setVisibility(View.VISIBLE);
            }
        });

        btnFinishBreak.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                breakFinishTime = System.nanoTime();
                long breakTime = breakFinishTime - breakStartTime;
                Toast.makeText(getApplicationContext(), getDate(TimeUnit.NANOSECONDS.toMillis(breakTime), "mm:ss:SSS"), Toast.LENGTH_LONG).show();
            }
        });

        public static String getDate(long milliSeconds, String dateFormat){
        // Create a DateFormatter object for displaying date in specified format.
        SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);

        // Create a calendar object that will convert the date and time value in milliseconds to date.
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(milliSeconds);
        return formatter.format(calendar.getTime());
        }

我用过这个link将毫秒转换为小时和分钟。

最佳答案

我对您的代码做了一些实验,使用了 System.nanoTime() 和 System.currentTimeMillis() ,并且在这两种情况下我都成功了。

使用 System.currentTimeMillis()

long breakStartTime, breakTime;
 btnStartBreak.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                breakStartTime = System.currentTimeMillis();
                breakTv.setText("Do you want to finish the break?");
                btnStartBreak.setVisibility(View.GONE);
                btnFinishBreak.setVisibility(View.VISIBLE);
            }
        });

    btnFinishBreak.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            breakTime = System.currentTimeMillis() - breakStartTime ;
            Toast.makeText(getApplicationContext(), getDate(breakTime, "mm:ss.SSS"), Toast.LENGTH_LONG).show();
        }
    });

使用 System.nanoTime()
nanoTime() 专门设计用于测量耗时,而 currentTimeMillis() 则依赖于系统时钟设置的时间(可以更改)。因此,最好使用 nanoTime() 来计算耗时。

long breakStartTime, breakTime , durationInMs;
btnStartBreak.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    breakStartTime = System.nanoTime();
                    breakTv.setText("Do you want to finish the break?");
                    btnStartBreak.setVisibility(View.GONE);
                    btnFinishBreak.setVisibility(View.VISIBLE);
                }
            });

    btnFinishBreak.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            breakTime = System.nanoTime() - breakStartTime ;
            //convert nanoseconds value to milliseconds
            durationInMs = TimeUnit.MILLISECONDS.convert(breakTime , TimeUnit.NANOSECONDS); 
            Toast.makeText(getApplicationContext(), getDate(durationInMs, "mm:ss.SSS"), Toast.LENGTH_LONG).show();
        }
    });

关于java - 单击两次按钮的持续时间返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34255159/

相关文章:

Android Espresso 如何执行触摸事件

sql - 我需要从 dateColumn 获取月份和年份

java - 在java中将月份和年份转换为日期

java - 获取 json 文件中的条目数

java - 如何使用 Java Swing 实现可拖动选项卡?

android - 如何将部分Actionbar标题设置为粗体

android - 无法删除 C++ 中的空文件夹

r - 想要使用 R 在列中组合日期和时间

java - HTML5 历史记录服务器端支持的 URL 重写

java - 执行 jar 文件时无法找到或加载主类