如何获取timepicker所选择的时间以毫秒为单位,并比较android中两个时间选择器之间的时差?

问题描述

我研究了无数示例,并尝试了这种方法,但是并没有为我提供正确的输出。非常感谢您的帮助。谢谢,我们非常感谢您对该代码或新代码进行的任何更正。我以下面的方式尝试了所有知识,我也尝试了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,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();
                    }
                },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.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,这是现代类的backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在较旧的Android上,请使用废除旧书或Android版本的ThreeTen Backport。称为ThreeTenABP。在后一种情况下,请确保使用子包从org.threeten.bp导入日期和时间类。

链接