Получите сегодня полночь в виде миллисекунд для данного часового пояса java - PullRequest
2 голосов
/ 20 марта 2020

Мне нужно получить сегодняшнее полночное время в миллисекундах. Например, сегодняшняя дата 2020-03-20, и я конвертирую сегодняшнюю полночь в миллисекунды, используя приведенный ниже код. Если он работает нормально в моей локальной среде, но проблема в том, что когда я развертываю этот код на сервере, сервер имеет часовой пояс UT C, поэтому даже если я пропущу часовой пояс, возвращенные миллисекунды будут неправильными. После отладки я обнаружил, что это происходит из-за разбора даты, дата использует часовой пояс по умолчанию. Я попытался установить часовой пояс в дате, но возвращаемое значение в миллисекундах неверно, даже если дата - 2020/03/20 00:00:00. Ниже приведены некоторые примеры.

В локальной среде: Часовой пояс перейдите к методу = "Asia / Colombo"

Дата в миллисекундах = 1584642600000

Дата преобразования = пт 20 марта 2020 г. 00: 00: 00

В среде сервера: часовой пояс перейти к методу = "Asia / Colombo"

Дата в миллисекундах = 1584662400000

Конвертированная дата = Пт 20 марта 2020 05: 30: 00

Обратите внимание, что здесь часовой пояс - это значение, которое я передаю параметру моего метода. Я использую java 8.

    private static final String DATE_FORMAT = "yyyy/MM/dd 00:00:00";

    private long getTMT(String timeZone) {
        try {
            ZoneId zoneId = ZoneId.of(timeZone);
            ZonedDateTime currentZone = ZonedDateTime.now(zoneId);
            ZonedDateTime zonedDateTime =
                    currentZone.withZoneSameInstant(zoneId);
            DateTimeFormatter format =
                    DateTimeFormatter.ofPattern(DATE_FORMAT);
            String formattedDateTime = zonedDateTime.format(format);
            SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
            Date date = sdf.parse(formattedDateTime);
            return date.getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

Надеюсь, я четко объяснил свой вопрос, пожалуйста, дайте мне знать ваши ответы / комментарии по этому вопросу.

Спасибо.

1 Ответ

4 голосов
/ 20 марта 2020

Форматирование в строку, а затем ее синтаксический анализ - ужасное решение, тем более что вам также нужно каждый раз создавать все эти синтаксические анализаторы, и ваш формат эффективно содержит хаки.

Существуют более простые способы оба строят полночь ZDT:

ZonedDateTime zdt = LocalDate.now(zoneId).atTime(LocalTime.MIDNIGHT).atZone(zoneID);

и затем извлекают из нее значение эпох-миллис:

long epoch = zdt.toInstant().toEpochMilli();

В качестве альтернативы, поскольку вы знаете, что миллисекунды и наносекунды всегда равны 0 в полночь, это немного быстрее:

long epoch = zdt.toEpochSecond() * 1000;

Второй подход не будет работать, если ваше время будет произвольным, так как он всегда будет игнорировать значение milli-of-second.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...