【问题标题】:How do I get time picked by timepicker in milliseconds and compare time difference between the two time pickers in android?如何以毫秒为单位获取 timepicker 选择的时间并比较 android 中两个时间选择器之间的时间差?
【发布时间】:2020-12-06 16:45:37
【问题描述】:

我查看了许多示例并尝试了这种方式,但它没有让我得到正确的输出。非常感谢任何帮助。谢谢,非常感谢代码中的任何更正或新代码。凭借我通过以下方式尝试过的所有知识,我也尝试过 SimpleDateFormat 函数,但每次我选择时间时它最终都会占用 1970 年 1 月 1 日。

import androidx.appcompat.app.AppCompatActivity;

import android.app.TimePickerDialog;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

import com.google.firebase.Timestamp;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreSettings;

import java.security.CodeSigner;
import java.sql.Time;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
//import java.util.Date;

public class HourlyCalculator extends AppCompatActivity {
    EditText wage;
    TextView t1, t2, t3;
    ImageView i1, i2;
    Button b1;
    String timex;
    String timey;
    long timeyy;
    long timexx;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.calculator_hourly);
        wage = findViewById(R.id.hourlyrate);
        t1 = findViewById(R.id.starttimetext);
        t2 = findViewById(R.id.endtimetext);
        t3 = findViewById(R.id.finaltime);
        i1 = findViewById(R.id.startimage);
        i2 = findViewById(R.id.endimage);
        b1 = findViewById(R.id.calculatebutton);


        Calendar c = Calendar.getInstance();

        final int hour = c.get(Calendar.HOUR_OF_DAY);
        final int mins = c.get(Calendar.MINUTE);

        i1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final TimePickerDialog time = new TimePickerDialog(HourlyCalculator.this, new TimePickerDialog.OnTimeSetListener() {
                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay1, int minute1) {
                        timex = hourOfDay1 + ":" + minute1;
                        t1.setText(timex);
                        Log.d("Time1", timex);
                        Calendar c3 = Calendar.getInstance();
                        c3.set(Calendar.HOUR_OF_DAY, hourOfDay1);
                        c3.set(Calendar.MINUTE, minute1);
                        timeyy = c3.getTimeInMillis();
                    }
                },hour, mins, true);
                time.show();
            }
        });

        i2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final TimePickerDialog time2 = new TimePickerDialog(HourlyCalculator.this, new TimePickerDialog.OnTimeSetListener() {
                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                        timey = hourOfDay + ":" + minute;
                        t2.setText(timey);
                        Log.d("Time1", timey);
                        Calendar c2 = Calendar.getInstance();
                        c2.set(Calendar.HOUR_OF_DAY, hourOfDay);
                        c2.set(Calendar.MINUTE, minute);
                        timexx = c2.getTimeInMillis();
                    }
                },hour,mins,true);
                time2.show();
            }
        });
        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                long difference = timexx - timeyy;
                long minutesdifference = difference / 60000;
                Log.d("Result", String.valueOf(minutesdifference))
                
               
            }
        });
    }
}

当我试图找出同一天内两个时间选择器之间的差异时。它给我带来了想要的输出,即 10:55 和 11:55 之间的差异给了我 60 分钟。当我的时间落在前几天时,它给了我否定的答案。即 23:52 和 00:00 给我 -1431。

【问题讨论】:

  • 不清楚,抱歉。什么是正确的输出?而你得到了什么?请举例说明(或两个)您输入的内容和返回的内容。另外,您尝试的示例有什么问题?这样我们就不会只是重复这些。

标签: java android time timepicker milliseconds


【解决方案1】:

java.time

使用现代 Java 日期和时间 API java.time 进行时间工作。虽然我不知道为什么您的代码不起作用,但下面的简化示例可以。

编辑:现在考虑到timexx 可能在第二天

    LocalTime timeyy;
    LocalTime timexx;
    
    int hourOfDay1 = 23;
    int minute1 = 52;
    timeyy = LocalTime.of(hourOfDay1, minute1);
    
    int hourOfDay = 0;
    int minute = 0;
    timexx = LocalTime.of(hourOfDay, minute);
    
    long minutesdifference = ChronoUnit.MINUTES.between(timeyy, timexx);
    if (minutesdifference < 0) { // timexx is the following day; add 1 day
        minutesdifference += Duration.ofDays(1).toMinutes(); 
    }
    System.out.println("Result: " + minutesdifference + " minutes");

输出是:

结果:8 分钟

您可能还想研究使用Duration 类。下面有一个链接。

问题:java.time 不需要 Android API 26 级吗?

java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
  • 在非 Android 的 Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在较旧的 Android 上,请使用脱糖或 Android 版本的 ThreeTen Backport。它被称为 ThreeTenABP。在后一种情况下,请确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2014-02-26
    • 1970-01-01
    相关资源
    最近更新 更多