найти, если время находится в диапазоне времени с ограничением часового пояса - PullRequest
0 голосов
/ 11 июня 2018

Я пишу приложение для Android, и мне нужно знать, открыт ли магазин в течение определенного периода времени или нет.Я уже использую код ниже:

try {
        Date time1 = new SimpleDateFormat("HH:mm:ss").parse(getResources().getString(R.string.opening_time));
        Calendar calendar1 = Calendar.getInstance();
        calendar1.setTime(time1);

        Date time2 = new SimpleDateFormat("HH:mm:ss").parse(getResources().getString(R.string.closing_time));
        Calendar calendar2 = Calendar.getInstance();
        calendar2.setTime(time2);
        calendar2.add(Calendar.DATE, 1);


        Date current = new SimpleDateFormat("HH:mm:ss").parse(getCurrentTime());
        Calendar calendar3 = Calendar.getInstance();
        calendar3.setTime(d);
        calendar3.add(Calendar.DATE, 1);

        Date x = current.getTime();
        if (x.after(calendar1.getTime()) && x.before(calendar2.getTime())) {
            isOpened = true;
        }
    } catch (ParseException e) {
        e.printStackTrace();
    } finally {
        return isOpened;
    }

Проблема с этим кодом заключается в том, что он не учитывает часовой пояс.

time1 и time2 - соответственно время открытия и закрытия, и они основаны на часовом поясе PST.прямо сейчас они определены следующим образом:

<string name="opening_time">06:00:00</string>
<string name="closing_time">18:00:00</string>

они основаны на 24-часовом формате и не указывают часовой пояс.поскольку время открытия всегда основывается на одном и том же часовом поясе, я могу настроить программно, если это необходимо.

Как мне заставить его работать правильно, чтобы он отвечал на истину или ложь, если магазин открыт и учитывает часовой пояс.Поскольку мой магазин открыт с 6 утра до 6 вечера по тихоокеанскому времени, если кто-то попытается войти в 8 вечера по восточному времени, это должно быть хорошо.

У меня минимальная поддержка API 19

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Проще всего хранить расчеты в часовом поясе магазина, чтобы вам не нужно было конвертировать часовые пояса:

import org.threeten.bp.LocalTime;
import org.threeten.bp.ZoneId;

public class IsStoreInOtherTimeZoneOpen {

    public static void main(String[] args) {
        ZoneId storeTimeZone = ZoneId.of("America/Los_Angeles");

        LocalTime openingTime = LocalTime.parse("06:00:00");
        LocalTime closingTime = LocalTime.parse("18:00:00");
        LocalTime nowInStore = LocalTime.now(storeTimeZone);
        boolean isOpen = nowInStore.isAfter(openingTime) && nowInStore.isBefore(closingTime);

        System.out.println("Is store open? " + isOpen);
    }

}

Я только что запустил этот код на своем компьютере.Местное время (часовой пояс Европа / Копенгаген) составило 21:31, равное 12:31 в Лос-Анджелесе.Отпечатанный фрагмент:

Открыт ли магазин?true

Код не зависит от часового пояса устройства, если часы устройства работают правильно.

Я использую и рекомендую java.time, современный Java API даты и времени.

Вопрос: Могу ли я использовать java.time на уровне API Android 19?

Да, java.time прекрасно работает на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26, как мне сказали), современный API поставляется встроенным.в.В этом случае импортируйте java.time.LocalTime и java.time.ZoneId (не классы из org.threeten.bp, которые я использую выше).
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen дляJSR 310; см. Ссылки внизу).
  • На более старых версиях Android используется версия ThreeTen Backport для Android.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.Мне сказали, что используемые зависимости compile group: 'org.threeten', name: 'threetenbp', version: '1.3.3', classifier: 'no-tzdb'.

Ссылки

0 голосов
/ 11 июня 2018

если вы установите время UTC будет одинаковым для всех часовых поясов, попробуйте что-то подобное:

   SimpleDateFormat SM_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS")
   SM_DF_POST_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...