在安卓系统中比较两个时间

7

我已经尝试过以下代码来比较两个时间:

   SimpleDateFormat sdf = new SimpleDateFormat("hh:mm");
    Date inTime = sdf.parse("11:00");
    Date outTime = sdf.parse("10:00");

    if(inTime.compareTo(outTime) > 0){
    Toast.makeText(this, "Out time should be greater than In time", Toast.LENGTH_SHORT).show();
    }

以上代码运行良好。

但如果我把上班时间设置为11:00,下班时间设置为12:00,我就会收到上述toast消息。

如果我将下班时间设为12:00至12:59,则会收到上述toast消息。在其他情况下,以上代码都可以正常工作。

我做错了什么?请帮帮我。


1
请注意,像java.util.Datejava.util.Calendarjava.text.SimpleDateFormat这样的老旧日期时间类现在已经过时,被java.time类所取代。大部分java.time功能已经在ThreeTen-Backport项目中向Java 6和Java 7进行了回溯移植。同时,在ThreeTenABP项目中还进行了适配以支持更早期的Android版本。请参阅如何使用ThreeTenABP... - Basil Bourque
4个回答

6

将SimpleDateFormat更改为以下格式...

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");

以下是模式:
H   Hour in day (0-23)  Number  0
k   Hour in day (1-24)  Number  24
K   Hour in am/pm (0-11)    Number  0
h   Hour in am/pm (1-12)    Number  12

这将有效...


将“hh:mm”更改为“HH:mm”后,我得到了期望的结果。非常感谢你,Sanket。 - user3021918

2

tl;dr

Use java.time.

LocalTime
.parse( "12:00" )
.isAfter(
    LocalTime.parse( "11:00" ) 
)

java.time

你有三个问题:
  • 你正在使用可怕的旧日期时间类(DateSimpleDateFormat),这些类已经在多年前被现代的java.time类替代。
  • 你的hh:mm格式应该是大写字母表示24小时制,而不是12小时制:HH:mm
  • 你不适当地尝试使用一个用于带有日期时间值的类来表示一天中的时间。

使用LocalTime。这个类表示没有日期和时区的一天中的时间。

LocalTime start = LocalTime.parse( "11:00" ) ;
LocalTime stop = LocalTime.parse( "12:00" ) ;

你可以进行比较。
boolean isStopAfterStart = stop.isAfter( start ) ;

将经过的时间计算为Duration
Duration d = Duration.between( start , stop ) ;

您还可以查询Duration是否为负数,这是另一种检测停止时间在开始时间之前的方法。
(注:原文中 `d.toString(): PT1H` 是一个代码输出结果,表示持续时间为 1 小时。)
boolean isStopBeforeStart = d.isNegative() ;

警告:在没有日期和时区上下文的情况下处理时间可能会产生不现实的结果。这种方法忽略了发生在诸如夏令时(DST)和其他转变到特定地区人们使用的挂钟时间的时区中的异常情况。一个小时可以重复或被跳过。一天可以长达23、23.5、23.75、25或其他小时数。

关于 java.time

java.time 框架已经内置于 Java 8 及以上版本。这些类取代了老旧的 遗留 日期时间类,如 java.util.DateCalendarSimpleDateFormat

Joda-Time项目现在处于维护模式,建议迁移到java.time类。

了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范为JSR 310

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。无需字符串,无需java.sql.*类。

如何获取java.time类?


0
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TimePicker;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * Created by Ketan Ramani on 20/9/18.
 */

public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener {
    private static EditText text;
    private static TextView textTv;
    private static Date startDate = null;
    private static Date fromTime = null;

    public static TimePickerFragment getInstance(View view) {
        if (view instanceof EditText) {
            text = (EditText) view;
        } else if (view instanceof TextView) {
            textTv = (TextView) view;
        }

        return new TimePickerFragment();
    }

    public static TimePickerFragment getInstance(View view, Date fromTimeCalendar) {
        if (view instanceof EditText) {
            text = (EditText) view;
        } else if (view instanceof TextView) {
            textTv = (TextView) view;
        }

        fromTime = fromTimeCalendar;

        return new TimePickerFragment();
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);

        // Create a new instance of TimePickerDialog and return it
        return new TimePickerDialog(getActivity(), this, hour, minute, true/*DateFormat.is24HourFormat(getActivity())*/);
    }

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

        if (fromTime != null) {

            Calendar fromTimeCal = Calendar.getInstance();
            fromTimeCal.setTime(fromTime);

            SimpleDateFormat sdf = new SimpleDateFormat("hh:mm");
            Date toDate = null;
            try {
                toDate = sdf.parse(String.format("%02d", hourOfDay) + ":" + String.format("%02d", minute));
            } catch (ParseException e) {
                e.printStackTrace();
            }

            Calendar toTimeCal = Calendar.getInstance();
            toTimeCal.setTime(toDate);

            if (toTimeCal.getTimeInMillis()<fromTimeCal.getTimeInMillis()){
                Helper.showToast(getActivity(),"To time can't less than from time");
            } else {
                if (text != null) {
                    text.setText(getFormatedTime(hourOfDay, minute));
                } else if (textTv != null) {
                    textTv.setText(getFormatedTime(hourOfDay, minute));
                }
            }
        } else {
            if (text != null) {
                text.setText(getFormatedTime(hourOfDay, minute));
            } else if (textTv != null) {
                textTv.setText(getFormatedTime(hourOfDay, minute));
            }
        }
    }

    private String getFormatedTime(int hourOfDay, int minute) {
        int hour, min;
        Calendar datetime = Calendar.getInstance();
        String am_pm = "";
        datetime.set(Calendar.HOUR_OF_DAY, hourOfDay);
        datetime.set(Calendar.MINUTE, minute);

        if (datetime.get(Calendar.AM_PM) == Calendar.AM)
            am_pm = "AM";
        else if (datetime.get(Calendar.AM_PM) == Calendar.PM)
            am_pm = "PM";
        hourOfDay = hourOfDay > 12 ? hourOfDay - 12 : hourOfDay;
        hour = hourOfDay > 9 ? hourOfDay : hourOfDay;
        min = minute > 9 ? minute : minute;

        return String.format("%02d", hour) + ":" + String.format("%02d", min) + " " + am_pm;
    }

    public void showTimePickerDialog(Context context, View view) {
        DialogFragment newFragment = TimePickerFragment.getInstance(view);
        newFragment.show(((AppCompatActivity) context).getSupportFragmentManager(), "TimePicker");
    }

    public void showTimePickerDialog(Context context, View view, Date fromTime) {
        DialogFragment newFragment = TimePickerFragment.getInstance(view, fromTime);
        newFragment.show(((AppCompatActivity) context).getSupportFragmentManager(), "TimePicker");
    }
}

使用

@Override
    public void onClick(View v) {
        switch (v.getId()) {

            case R.id.et_from_time:

                TimePickerFragment fromTime = new TimePickerFragment();
                fromTime.showTimePickerDialog(context, v, null);

                mToTimeEt.setText("Select To Time");
                break;

            case R.id.et_to_time:

                if(mFromTimeEt.getText().toString().equalsIgnoreCase("Select From Time")){
                    Helper.showToast(context,"Please, select from time first");
                } else {
                    SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a");
                    Date fromDate = null;
                    try {
                        fromDate = sdf.parse(mFromTimeEt.getText().toString());
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }

                    TimePickerFragment toTime = new TimePickerFragment();
                    toTime.showTimePickerDialog(context, v, fromDate);
                }
                break;
        }
    }

这个类适用于EditText和TextView,如果结束时间在HH:mm a格式中晚于开始时间,则为相应的EditText或TextView设置时间


1
请注意,像java.util.Datejava.util.Calendarjava.text.SimpleDateFormat这样的老旧日期时间类现在已经过时,被java.time类所取代。大部分java.time功能已经在ThreeTen-Backport项目中向Java 6和Java 7进行了回溯。同时,在ThreeTenABP项目中还进行了适配以支持早期的Android版本。请参阅如何使用ThreeTenABP... - Basil Bourque

-1
如果您使用24小时制,请使用kk代替HH
 SimpleDateFormat sdf = new SimpleDateFormat("kk:mm");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接