Java 使用自定义时间获取当前日期

Java 使用自定义时间获取当前日期,java,android,date,datetime,Java,Android,Date,Datetime,我有一些时间字符串,例如“09:00”和“17:30”,我需要检查当前时间是否在该范围内 我想我可以做一个比较: SimpleDateFormat format = new SimpleDateFormat("HH:mm"); Date now = new Date(); Date begin; Date end; begin = format.parse(begin_string); end = format.parse(end_string); if (now.compareTo(beg

我有一些时间
字符串
,例如
“09:00”
“17:30”
,我需要检查当前时间是否在该范围内

我想我可以做一个比较:

SimpleDateFormat format = new SimpleDateFormat("HH:mm");
Date now = new Date();
Date begin;
Date end;

begin = format.parse(begin_string);
end = format.parse(end_string);

if (now.compareTo(begin) > 0 && end.compareTo(now) > 0)
    return true;
else
    return false;
结果表明,当我解析字符串时,时间被正确解析,但日期被设置为1970年1月1日。这样,代码将始终返回
false

我想知道如何将
开始
结束
设置为当前日期,但要使用字符串中的时间。

  • 获取当前时间,
    Calendar.getInstance()
  • 获取另外两个当前时间实例,并根据输入设置时间字段
例如:

Calendar.set(Calendar.HOUR_OF_DAY, 1);
  • 并在时间范围内调用
    compare()
      • 获取当前时间,
        Calendar.getInstance()
      • 获取另外两个当前时间实例,并根据输入设置时间字段
      例如:

      Calendar.set(Calendar.HOUR_OF_DAY, 1);
      
      • 并在时间范围内调用
        compare()
        • 你真的应该使用。然后,您可以根据从字符串解析的值单独设置小时和分钟。然后获取以毫秒为单位的时间,并进行比较

          Date now = new Date();
          Calendar cal = Calendar.getInstance();
          cal.setTime(now);
          cal.set(Calendar.HOUR_OF_DAY, hours);
          cal.set(Calendar.MINUTE, minutes);
          long time = cal.getTimeInMillis();
          
          你也可以使用这个奇妙的图书馆。在我看来,Joda是处理日期和时间的一种更好的方法。

          你真的应该使用。然后,您可以根据从字符串解析的值单独设置小时和分钟。然后获取以毫秒为单位的时间,并进行比较

          Date now = new Date();
          Calendar cal = Calendar.getInstance();
          cal.setTime(now);
          cal.set(Calendar.HOUR_OF_DAY, hours);
          cal.set(Calendar.MINUTE, minutes);
          long time = cal.getTimeInMillis();
          

          你也可以使用这个奇妙的图书馆。在我看来,Joda是处理日期和时间的一种更好的方法。

          您也可以像这样重用当前时间的format对象:

          SimpleDateFormat format = new SimpleDateFormat("HH:mm");
          Date now = new Date();
          String time = format.format(now); // format to wall time loosing current date
          System.out.println(time);
          now = format.parse(time); // reparse wall time
          System.out.println(now);
          
          因此,您可以隐式使用系统的标准时区将
          now
          转换为1970,然后可以使用它与
          begin
          end
          进行直接比较

          Date begin = format.parse("09:00");
          Date end = format.parse("21:30");
          return (begin.before(now) && end.after(now)); // open-bounded interval
          

          您也可以像这样在当前时间重复使用format对象:

          SimpleDateFormat format = new SimpleDateFormat("HH:mm");
          Date now = new Date();
          String time = format.format(now); // format to wall time loosing current date
          System.out.println(time);
          now = format.parse(time); // reparse wall time
          System.out.println(now);
          
          因此,您可以隐式使用系统的标准时区将
          now
          转换为1970,然后可以使用它与
          begin
          end
          进行直接比较

          Date begin = format.parse("09:00");
          Date end = format.parse("21:30");
          return (begin.before(now) && end.after(now)); // open-bounded interval
          

          捆绑的java.util.Date和.Calendar类是出了名的麻烦。避开它们。使用Java 8中的库或新发现的库(受Joda Time的启发,由JSR 310定义)

          如果您确实不关心时区或日期,请使用类或类

          警告:天真的程序员通常认为他们只需要本地时间,因此可以忽略时区,但他们会后悔自己的处境

          乔达时间 如果时间的格式正确(24小时,正确的位数),则可以直接将字符串输入传递给LocalTime的构造函数,而无需费心解析。该类有一个内置的ISO8601风格的解析器

          String inputStart = "09:00";
          String inputStop = "17:30";
          
          LocalTime start = new LocalTime( inputStart );
          LocalTime stop = new LocalTime( inputStop );
          
          LocalTime now = LocalTime.now();
          
          // Comparing using Half-Open logic, where beginning is inclusive and ending is exclusive.
          boolean isNowContainedWithinInterval = ( ( now.isEqual( start ) ) || ( now.isAfter( start ) ) ) && ( now.isBefore( stop ) );
          
          转储到控制台

          System.out.println( "start: " + start );
          System.out.println( "stop: " + stop );
          System.out.println( "now: " + now );
          System.out.println( "isNowContainedWithinInterval: " + isNowContainedWithinInterval );
          
          当运行时

          start:09:00:00.000
          车站:17:30:00.000
          现在:12:42:06.567
          现在包含在Interval中:true
          

          在现实世界中,我会添加一个断言测试,证明停止时间晚于开始时间,以验证输入。

          捆绑的java.util.Date和.Calendar类是出了名的麻烦。避开它们。使用Java 8中的库或新发现的库(受Joda Time的启发,由JSR 310定义)

          如果您确实不关心时区或日期,请使用类或类

          警告:天真的程序员通常认为他们只需要本地时间,因此可以忽略时区,但他们会后悔自己的处境

          乔达时间 如果时间的格式正确(24小时,正确的位数),则可以直接将字符串输入传递给LocalTime的构造函数,而无需费心解析。该类有一个内置的ISO8601风格的解析器

          String inputStart = "09:00";
          String inputStop = "17:30";
          
          LocalTime start = new LocalTime( inputStart );
          LocalTime stop = new LocalTime( inputStop );
          
          LocalTime now = LocalTime.now();
          
          // Comparing using Half-Open logic, where beginning is inclusive and ending is exclusive.
          boolean isNowContainedWithinInterval = ( ( now.isEqual( start ) ) || ( now.isAfter( start ) ) ) && ( now.isBefore( stop ) );
          
          转储到控制台

          System.out.println( "start: " + start );
          System.out.println( "stop: " + stop );
          System.out.println( "now: " + now );
          System.out.println( "isNowContainedWithinInterval: " + isNowContainedWithinInterval );
          
          当运行时

          start:09:00:00.000
          车站:17:30:00.000
          现在:12:42:06.567
          现在包含在Interval中:true
          

          在现实世界中,我会添加一个断言测试,证明停止时间晚于开始时间,以验证输入。

          但这样我必须手动解析字符串以获得小时和分钟,然后设置日历?您可以使用
          SimpleDateFormat
          进行解析,但这样我必须手动解析字符串以获取小时和分钟,然后设置日历?您可以使用
          SimpleDateFormat
          进行解析起初我认为这是一个不雅观的解决方案,但事实证明它很容易理解和使用。@Guillerme是的,使用
          java.util.Date
          通常不是很优雅,但至少这段代码解决了所有的陷阱(您甚至可以在format对象上显式设置时区)。其他库,如JodaTime、JSR-310(Java8)或my library有一种特殊类型的
          LocalTime
          ,这会更好。起初我认为这是一种不雅观的解决方案,但事实证明它很容易理解和使用。@Guillerme是的,使用
          java.util.Date
          通常不是很优雅,但至少这段代码解决了所有的陷阱(您甚至可以在format对象上显式设置时区)。其他库,如JodaTime、JSR-310(Java8)或my library,都有一个特殊的类型
          LocalTime
          ,这会更好。