我想做一个函数,我想只在给定的时间之间工作。
。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();
}
br
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
h1> Yoni的答案接近于正确的解决方案,但通过使用java.util.Date
类继续您的困惑。永远不要使用java.util.Date
,停下来,放手,继续生活。 那些遗留的日期时间类是一团乱麻。Sun、Oracle和JCP社区在几年前采用JSR 310时放弃了它们。你也应该这样。 你说:
。e:如果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
对象
与目标起始端比较。
通常最好使用Half-Open方法来定义时间范围,其中开始是包含,而结束是不包含。
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
}
问题是你正在比较你的两个固定日期。你查一下13:00是在14:00之后。这总是正确的
要比较的是当前时间。您希望当前时间在开始时间之后,在结束时间之前。
从java 8开始,还建议使用LocalTime
而不是Date
。这解决了许多您可能遇到的时区等问题。
要获得当前时间,可以使用LocalTime.now()
。代码片段看起来像这样然后
LocalTime now = LocalTime.now();
now.isAfter(startTime) && now.isBefore(endTime);