java - 将字符串 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();
}
解决方案
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
}
推荐阅读
- php - 如何解决摘录内搜索结果中的重复项
- jsp - 当用户单击添加到购物车时,项目应存储在表格中
- reactjs - 使用 React 设计(真实房屋的)窗框
- javascript - Android 应用程序强制关闭,SQLite 数据库的东西
- javascript - onEachfeatures 不显示内容但 [object Object]
- raku - 带有自定义词法分析器的 Raku 语法
- javascript - 如何编辑图像 JavaScript 的加载优先级
- reactjs - 如何将条件道具传递给打字稿中未知类型的反应组件?
- c++ - PCL、SACS分割检测球
- asp.net-core - Asp.Net core 3.1 web 应用程序在运行时意外终止,没有任何异常