【问题标题】:Check current time lies in two times in java [duplicate]在java中检查当前时间位于两次[重复]
【发布时间】:2016-06-21 23:57:31
【问题描述】:

我正在尝试检查当前时间是否在开始时间结束时间之间。但我的方法总是返回 false:

来自 = "5:10:00"; to = "10:10:00"


private boolean isTimeBetweenTwoTime(String from, String to) throws ParseException {
    SimpleDateFormat formatter = new SimpleDateFormat("H:mm:ss");

    Date date_from = formatter.parse(from);
    Date date_to = formatter.parse(to);

    Time startTime = new Time(date_from.getTime());
    Time endTime = new Time(date_to.getTime());

    Calendar c = Calendar.getInstance();
    Time now = new Time(c.getTimeInMillis());

    if (now.before(endTime) && now.after(startTime)) {
        Log.d(LOG_TAG, "Yes time between");
        return true;
    }

    return false;
}

【问题讨论】:

  • 你试过硬编码now时间吗?
  • 当然是false。仅仅因为java.sql.Time 类代表一个时间,并不意味着底层java.util.Date 类将丢失其日期信息。所以nowendTime之后的方式,自2016年> 1970年。

标签: java android time


【解决方案1】:

问题是当你这样做时

Date date_from = formatter.parse(from);
Date date_to = formatter.parse(to);

并且格式化程序是这样定义的:

SimpleDateFormat formatter = new SimpleDateFormat("H:mm:ss");

然后是只与时间相关的 java api,但日期对象包含的不仅仅是时间信息,它们也包含年、月等,并且这些正在初始化到一个纪元 UNIXTime

所以您创建的初始日期是

1970 年 1 月 1 日星期四 05:10:00 CET 和 1970 年 1 月 1 日星期四 10:10:00 CET

所以询问今天/现在(2016 年 6 月 22 日)是否在这些日期之间将永远不会返回 true...

另一方面,您的条件看起来是倒置的,作为最后的提示,您不需要 SQL 类进行计算,只需使用日期对象就可以了

示例:

   public static void main(String[] args) throws ParseException {
    String from = "5:10:00";
    String to = "10:10:00";
    String n = "08:10:00";
    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
    Date date_from = formatter.parse(from);
    Date date_to = formatter.parse(to);
    Date dateNow = formatter.parse(n);
    if (date_from.before(dateNow) && date_to.after(dateNow)) {
        System.out.println("Yes time between");
    }
    }

【讨论】:

  • 因为我只处理时间限制,所以示例对我来说非常有效。我做了一些修改,在n 变量中添加了当前时间。
【解决方案2】:

java.time

您正在使用旧的过时类。它们已被 Java 8 及更高版本中内置的 java.time 类所取代。大部分功能已在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。

LocalTime

LocalTime 类实际上只代表一天中的时间值,这与问题中看到的 java.sql.Timejava.util.Date 类不同。

LocalTime start = LocalTime.of( 5 , 10 );
LocalTime stop = LocalTime.of( 10 , 0 );

时区

确定当前时间需要时区。对于任何给定的时刻,时间在全球范围内因时区而异。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalTime now = LocalTime.now( zoneId );

比较

通过调用equals、isAfter 或 isBefore 进行比较。我们在这里使用半开方法,这在日期时间工作中很常见,其中开头是 inclusive 而结尾是 exclusive

 Boolean isNowInRange = ( ! now.isBefore( start ) ) && now.isBefore( stop ) ;

【讨论】:

    【解决方案3】:

    检查一下

    将您的日期传递给方法

    public static int isValidDate(String start,String end){
            int valid=0;
            DateFormat formatter1 = new SimpleDateFormat("MM/dd/yyyy HH:MM:SS");
            Date d1 = null;
            Date d2 = null;
            Date d3 = null;
            Calendar curDate = Calendar.getInstance();
            SimpleDateFormat dfcurDate = new SimpleDateFormat("MM/dd/yyyy HH:MM:SS");
            String datecurrent = dfcurDate.format(curDate.getTime());
            try {
                d1 = formatter1.parse(datecurrent);
                d2 = new Date(Long.parseLong(end));
                d3 = new Date(Long.parseLong(start));
                System.out.println(d1.after(d3) && d1.before(d2));
                if (d1.after(d3) && d1.before(d2)) {
                    valid=1;
               } } catch (Exception e) {
                e.printStackTrace();
            }
            return valid;
        }
    

    如果返回1--当前

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 2013-06-13
      • 2021-06-29
      • 1970-01-01
      • 2013-08-10
      相关资源
      最近更新 更多