【问题标题】:Get current Date with custom time使用自定义时间获取当前日期
【发布时间】:2014-03-27 18:24:59
【问题描述】:

我有一些时间Strings,例如"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。

我想知道如何将begin 和end 设置为当前日期,但使用它们的字符串中的时间。

【问题讨论】:

    标签: java android date datetime


    【解决方案1】:

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

    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
    

    【讨论】:

    • 起初我认为它是一个不雅的解决方案,但结果它很容易理解和使用。
    • @Guilherme 是的,与java.util.Date 一起工作通常不是那么优雅,但至少这段代码解决了所有的缺陷(您甚至可以在格式对象中显式设置时区)。其他库,如 JodaTime、JSR-310 (Java8) 或我的库有一个特殊类型 LocalTime 会更好。
    【解决方案2】:
    • 获取当前时间,Calendar.getInstance();
    • 获取另外 2 个当前时间实例,并根据您的输入设置时间字段

    例如:

    Calendar.set(Calendar.HOUR_OF_DAY, 1);
    
    • 并在时间边界调用compare()

    【讨论】:

    • 但是这样我必须手动解析字符串来获取小时和分钟,然后设置日历?
    • 你可以使用SimpleDateFormat来解析
    【解决方案3】:

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

    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 库。在我看来,Joda 是处理日期和时间的更好方式。

    【讨论】:

      【解决方案4】:

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

      如果您真的不关心时区或日期,请使用 Joda-Time LocalTime 类或 java.time LocalTime 类。

      警告:天真的程序员通常认为他们只需要本地时间,因此可以忽略时区,但随后会后悔那个位置。

      乔达时间

      如果您的时间是正确的ISO 8601 格式(24 小时,正确的位数),那么您可以直接将字符串输入传递给 LocalTime 的构造函数,而无需解析。该类具有内置的 ISO 8601 样式解析器。

      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
      stop: 17:30:00.000
      now: 12:42:06.567
      isNowContainedWithinInterval: true
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-04
        • 2019-11-02
        • 1970-01-01
        • 2016-07-04
        • 2020-04-04
        • 2013-03-10
        相关资源
        最近更新 更多