首页 > 解决方案 > 将字符串 startTime 和 endTime 与当前时间进行比较并执行操作

问题描述

我正在尝试制作一个我只想在给定时间之间工作的功能。

即:如果 startTime 是“13:00”并且 endTime 是“14:00”,那么每天当用户在这个时间/之间使用我的应用程序时,然后调用该函数,否则什么也不做。

这是我在试图弄清楚时遇到的,但这不起作用。


 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm", Locale.UK);

       try {
           Date inTime = sdf.parse("13:00");
           Date outTime = sdf.parse("14:00");
           if (outTime != null) {
               if (isTimeAfter(inTime, outTime)) {
                   Toast.makeText(SplashScreenActivity.this, "Time validation success", Toast.LENGTH_LONG).show();
               }
               else {
                   Toast.makeText(SplashScreenActivity.this, "Exit time must be greater then entry time", Toast.LENGTH_LONG).show();
               }
           }
       } catch (ParseException e) {
           e.printStackTrace();
           Toast.makeText(SplashScreenActivity.this, "Parse error", Toast.LENGTH_LONG).show();
       }


public static boolean isTimeAfter(Date startTime, Date endTime) {
       return !endTime.before(startTime);
   }

任何帮助表示赞赏,谢谢!

更新 1

 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm", Locale.UK);
       Date now = new Date(System.currentTimeMillis());

       try {
           Date inTime = sdf.parse("03:19");
           Date outTime = sdf.parse("03:21");

           if (now.after(inTime) && now.before(outTime)) {
               Toast.makeText(SplashScreenActivity.this, "Time validation success", Toast.LENGTH_LONG).show();
           } else {
               Toast.makeText(SplashScreenActivity.this, "Nope, it isn't wokring", Toast.LENGTH_LONG).show();
           }
       } catch (ParseException e) {
           e.printStackTrace();
           Toast.makeText(SplashScreenActivity.this, "Parse error", Toast.LENGTH_LONG).show();
       }

标签: javaandroidtime

解决方案


tl;博士

LocalTime start = null ;
LocalTime end = null ;
try
{
    start = LocalTime.parse( "03:19" ) ;
    end = LocalTime.parse( "03:21" ) ;
} 
catch ( DateTimeParseException e ) 
{
    … handle faulty input
}

LocalTime currentTimeOfDay = LocalTime.now( ZoneId.systemDefault() ) ;
if( 
    ( ! currentTimeOfDay.isBefore( start ) )   // "Is not before …" is a briefer way of asking "Is equal to or later than …".
    &&
    currentTimeOfDay.isBefore( end )
)
{ … within target times }
else
{ … outside target times }

停止使用Date&SimpleDateFormat

Yoni的答案几乎是正确的解决方案,但通过使用java.util.Date类继续你的困惑。永远不要使用java.util.Date,停止,放手,继续前进。

那些遗留的日期时间类是一团糟。Sun、Oracle 和 JCP 社区几年前就放弃了它们,采用了JSR 310。你也应该这样。

你说:

即:如果 startTime 是“13:00”并且 endTime 是“14:00”,那么每天当用户在这个时间/之间使用我的应用程序时,然后调用该函数,否则什么也不做。

LocalTime

代表您的开始和结束时间。

LocalTime start = LocalTime.of( 13 , 0 ) ;
LocalTime end = LocalTime.of( 14 , 0 ) ;

捕捉在特定时区看到的当前时刻。

ZoneId

您可以假设用户想要使用 JVM 的默认时区。

ZoneId zoneId = ZoneId.systemDefault() ;

如果关键,您应该与用户确认他们的预期时区。使用 格式指定实时时区Continent/Region名称,而不是 2-4 个字母的伪时区名称,例如IST, EST,PST等。

ZoneId zoneId = ZoneId.of( "America/Edmonton" ) ;

ZonedDateTime

确定时区问题后,捕捉在该区域中看到的当前时刻。

ZonedDateTime now = ZonedDateTime.now( zoneId ) ;

从那一刻提取一天中的时间值。

LocalTime currentTimeOfDay = now.toLocalTime() ;

比较LocalTime对象

与您的目标起点比较。

通常最好使用半开放方法来定义时间跨度,其中开始是包容性的,而结束是排斥性的。

if( 
    ( ! currentTimeOfDay.isBefore( start ) )   // "Is not before …" is a briefer way of asking "Is equal to or later than …".
    &&
    currentTimeOfDay.isBefore( end )
)
{ … within target times }
else
{ … outside target times }

解析

如果您必须通过解析标准 ISO 8601 格式的文本来获取您的开始和结束时间值,其中小时是 24 小时制 (0-23) 并使用填充零,那么只需调用LocalTime.parse方法。无需指定格式模式。无需指定Locale.

LocalTime start = LocalTime.parse( "03:19" ) ;
LocalTime end = LocalTime.parse( "03:21" ) ;

为防止输入错误,请捕获DateTimeParseException.

LocalTime start = null ;
LocalTime end = null ;
try
{
    start = LocalTime.parse( "03:19" ) ;
    end = LocalTime.parse( "03:21" ) ;
} 
catch ( DateTimeParseException e ) 
{
    … handle faulty input
}


推荐阅读