Java 将字符串startTime和endTime与当前时间进行比较并执行操作
我想做一个函数,我只想在给定的时间内工作 i、 e:如果startTime为“13:00”,endTime为“14:00”,则每天当用户在此时间/之间使用我的应用程序时,请调用该函数,否则不执行任何操作 这是我在试图弄明白时遇到的情况,但这不起作用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
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示例以避免任何混淆。这也是应该使用的方式。