Я пытаюсь создать функцию, которую хочу работать только в определенное время.

То есть: если 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();
       }
2
Steven Rõgrê 24 Фев 2021 в 23:52

2 ответа

Лучший ответ

ТЛ ; др

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

Ответ Йони близок к тому, чтобы быть правильным решением, но продолжает вашу путаницу, используя класс 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

Сравните с вашим целевым началом.

Обычно лучше всего определять промежутки времени, используя подход 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) и используются нули для заполнения, тогда просто вызовите { {X0}} метод. Нет необходимости указывать шаблон форматирования. Нет необходимости указывать 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
}

2
Basil Bourque 24 Фев 2021 в 22:22

Проблема в том, что вы сравниваете свои 2 фиксированные даты. Убедитесь, что 13:00 после 14:00. Что всегда будет правдой.

Вы хотите сравнить текущее время. Вы хотите, чтобы текущее время было после времени начала и до времени окончания.

Чтобы узнать текущее время, вы можете использовать new Date(System.currentTimeMillis()) и используйте это для сравнения со временем начала и окончания

Это даст вам что-то вроде этого:

Date now = new Date(System.currentTimeMillis());
now.after(startTime) && now.before(endTime);

Версия Java 8+

Начиная с java 8, также рекомендуется использовать LocalTime вместо Date. Это решает множество проблем, с которыми вы можете столкнуться с часовыми поясами и т.п.

Чтобы узнать текущее время, вы можете использовать LocalTime.now(). Тогда фрагмент кода выглядит примерно так

LocalTime now = LocalTime.now();
now.isAfter(startTime) && now.isBefore(endTime);
1
Yoni 24 Фев 2021 в 21:44