【问题标题】:Comparing two times in android在android中比较两次
【发布时间】:2013-12-02 05:52:50
【问题描述】:

我尝试用下面的代码比较了两次:

   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 之间分配时间,我会收到上面的消息。在其他情况下,上述代码工作正常。

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

【问题讨论】:

  • 仅供参考,java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等麻烦的旧日期时间类现在已被 java.time 类所取代。大多数 java.time 功能在 ThreeTen-Backport 项目中被反向移植到 Java 6 和 Java 7。在ThreeTenABP 项目中进一步适用于早期的Android。见How to use ThreeTenABP…

标签: android time toast


【解决方案1】:

如下更改 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。
【解决方案2】:

tl;博士

使用java.time

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

java.time

你有三个问题:

  • 您正在使用可怕的旧日期时间类 (Date & SimpleDateFormat),这些类在几年前已被现代 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 ) ;

d.toString(): PT1H

您也可以ask the Duration if it is negative,作为另一种检测停止时间是否在开始之前的方法。

boolean isStopBeforeStart = d.isNegative() ;

警告:在没有日期和时区背景的情况下按时间工作可能会产生不切实际的结果。这种方法忽略了时区发生的异常情况,例如夏令时 (DST) 以及特定地区人们使用的挂钟时间的其他变化。一个小时可以重复,也可以跳过。一天可以是 23、23.5、23.75、25 或其他小时数。


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

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

从哪里获得 java.time 类?

【讨论】:

    【解决方案3】:
    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;
            }
        }
    

    如果 To time 是 After From Time in HH:mm a Format,则此类将适用于 EditText 和 TextView,并将时间设置为受尊重的 EditText 或 TextView

    【讨论】:

    • 仅供参考,java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等麻烦的旧日期时间类现在已被 java.time 类所取代。大多数 java.time 功能在 ThreeTen-Backport 项目中被反向移植到 Java 6 和 Java 7。在ThreeTenABP 项目中进一步适用于早期的Android。见How to use ThreeTenABP…
    【解决方案4】:

    如果您使用 24 小时时间格式,请使用 kk 而不是 HH

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      相关资源
      最近更新 更多