Java 将字符串startTime和endTime与当前时间进行比较并执行操作

Java 将字符串startTime和endTime与当前时间进行比较并执行操作,java,android,time,Java,Android,Time,我想做一个函数,我只想在给定的时间内工作 i、 e:如果startTime为“13:00”,endTime为“14:00”,则每天当用户在此时间/之间使用我的应用程序时,请调用该函数,否则不执行任何操作 这是我在试图弄明白时遇到的情况,但这不起作用 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm", Locale.UK); try { Date inTime = sdf.parse

我想做一个函数,我只想在给定的时间内工作

i、 e:如果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();
       }

问题是你正在比较你的两个固定日期。你检查13:00是否在14:00之后。这永远都是真的

您要比较的是当前时间。您希望当前时间在开始时间之后和结束时间之前

从Java8开始,还建议使用
LocalTime
而不是
Date
。这解决了您可能遇到的许多时区等问题

要获取当前时间,可以使用
LocalTime.now()
。 代码片段如下所示

LocalTime now = LocalTime.now();
now.isAfter(startTime) && now.isBefore(endTime);
tl;博士
LocalTime start=null;
LocalTime end=null;
尝试
{
start=LocalTime.parse(“03:19”);
end=LocalTime.parse(“03:21”);
} 
捕获(DateTimeParse异常)
{
…处理错误输入
}
LocalTime currentTimeOfDay=LocalTime.now(ZoneId.systemDefault());
如果(
(!currentTimeOfDay.isBefore(start))/“Is not before…”是询问“Is等于或晚于…”的更简单方式。
&&
currentTimeOfDay.isBefore(结束)
)
{…在目标时间内}
其他的
{…超出目标时间}
停止使用
Date
SimpleDateFormat
这个解决方案几乎是正确的,但是通过使用
java.util.Date
类,您仍然会感到困惑永远不要使用
java.util.Date
,停下来,放手,继续前进

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

你说:

i、 e:如果startTime为“13:00”,endTime为“14:00”,则每天当用户在此时间/之间使用我的应用程序时,请调用该函数,否则不执行任何操作

LocalTime
表示您的开始和结束时间

LocalTime start=LocalTime.of(13,0);
LocalTime end=LocalTime.of(14,0);
捕捉在特定时区中看到的当前时刻

ZoneId zoneId = ZoneId.systemDefault() ;
ZoneId
您可以假设用户想要使用JVM的默认时区

ZoneId zoneId = ZoneId.systemDefault() ;
如果关键,您应与用户确认其预期时区。使用
大陆/地区
格式指定名称,不要使用2-4个字母的伪区域,如
IST
EST
PST

ZoneId zoneId = ZoneId.of( "America/Edmonton" ) ;
ZoneDateTime
确定时区问题后,捕捉该时区中的当前时刻

ZonedDateTime now = ZonedDateTime.now( zoneId ) ;
从该时刻提取一天中的时间值

LocalTime currentTimeOfDay = now.toLocalTime() ;
比较
LocalTime
对象 与目标起点和终点进行比较

通常,最好使用半开放方法定义时间跨度,其中开始是包含的,而结束是独占的

if(
(!currentTimeOfDay.isBefore(start))/“Is not before…”是询问“Is等于或晚于…”的更简单方式。
&&
currentTimeOfDay.isBefore(结束)
)
{…在目标时间内}
其他的
{…超出目标时间}
解析 如果必须通过解析标准ISO 8601格式的文本(小时为24小时时钟(0-23))并使用填充零来获取开始和结束时间值,则只需调用方法。无需指定格式化模式。无需指定
区域设置

LocalTime start=LocalTime.parse(“03:19”);
LocalTime end=LocalTime.parse(“03:21”);
为防止输入错误,请设置陷阱

LocalTime start=null;
LocalTime end=null;
尝试
{
start=LocalTime.parse(“03:19”);
end=LocalTime.parse(“03:21”);
} 
捕获(DateTimeParse异常)
{
…处理错误输入
}

“但这不起作用”如果(outTime!=null){,它会做什么您不期望的事情?
“您希望
outTime
何时为
null
?这只是验证您的开始和结束时间是否有效。这不会与当前时间进行任何比较。@TimRoberts确切地说,这部分已经完成,但我不确定如何将这些值与本地设备时间进行比较,因此这个问题回答了您的问题吗?谢谢感谢您花费时间并试图提供帮助,但似乎不起作用。请检查我的编辑以了解我的尝试。虽然您的解决方案似乎很好,但问题在于兼容性。“LocalTime”需要API 26+并且我的应用程序支持运行21的设备,因此我正在寻找一种可以在所有设备上运行的方法。@StevenRõgrê最新版本的Android工具通过“API desugaring”将大部分java.time功能带到早期的Android上。我确实在anwser中提到使用LocalTime,但您是对的,这可能会让人困惑,因为我首先使用了日期版本。我更新了anwser,只留下LocalTime示例以避免任何混淆。这也是应该使用的方式。