Как рассчитать количество часов между текущей датой и строковой текстовой датой - PullRequest
0 голосов
/ 11 октября 2019

Я получаю строку из сервиса, 2 Nov 2019 07:30 pm, дата в United States Central Time.

Теперь мне нужно знать, сколько времени осталось между текущим временем и этой датой.

Я использую следующий код, но это не дает точной разницы.

SimpleDateFormat ticketDateFormat = new SimpleDateFormat("MMM d yyyy hh:mm a");
Date parsedDate= null;
try {
    parsedDate= ticketDateFormat.parse(dateTimeString);

    DateFormat formatter = new SimpleDateFormat("MMM d yyyy hh:mm a");
    TimeZone timeZone = TimeZone.getTimeZone("CST");
    formatter.setTimeZone(timeZone);


    parsedDate= ticketDateFormat.parse(formatter.format(parsedDate));


    long totalTimeRemainingInMillis= Math.abs(currentDateTime.getTime()- (parsedDate.getTime()));
    long diffInHours = TimeUnit.MILLISECONDS.toHours(totalTimeRemainingInMillis);



} catch (ParseException e) {
    e.printStackTrace();
}

Ответы [ 4 ]

1 голос
/ 11 октября 2019

Строковую дату «2 ноября 2019 г. 07:30» следует анализировать следующим образом:

new SimpleDateFormat("dd MMM yyyy hh:mm a")

Не так:

new SimpleDateFormat("MMM d yyyy hh:mm a");
1 голос
/ 11 октября 2019

Хотя в вашем вопросе неясно, откуда вы получаете текущее время, я предполагаю, что проблема в том, как вы используете TimeZone. Вы устанавливаете часовой пояс в формататоре, а затем анализируете дату, которая, как вы говорите, уже есть в CST.

Вот альтернативный способ сделать то же самое, а затем сравнить свои результаты:

LocalDateTime dateTime = LocalDateTime.now();
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("LLL d yyyy hh:mm a");
LocalDateTime parse = LocalDateTime.parse("Nov 2 2019 07:30 PM", fmt);
System.out.println(Duration.between(dateTime, parse).toHours());
0 голосов
/ 11 октября 2019

java.time и ThreeTenABP

Это будет работать на вашем уровне API Android:

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendPattern("d MMM uuuu hh:mm ")
            .parseCaseInsensitive()
            .appendPattern("a")
            .toFormatter(Locale.US);
    ZoneId zone = ZoneId.of("America/Chicago");

    ZonedDateTime currentDateTime = ZonedDateTime.now(zone);

    String dateTimeString = "2 Nov 2019 07:30 pm";
    ZonedDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter)
            .atZone(zone);

    long diffInHours = ChronoUnit.HOURS.between(currentDateTime, dateTime);
    System.out.println("Difference in hours: " + diffInHours);

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

Разница в часах: 541

Я использую java.time, современный Java-интерфейс даты и времени. С ним гораздо приятнее работать, чем со старыми и плохо спроектированными Date и SimpleDateFormat. С одной стороны, для синтаксического анализа строчных букв am и pm требуется немного больше строк кода (поскольку они обычно пишутся в верхнем регистре в США), с другой стороны, java.time проверяет более строго, что всегда хорошо. Преимущества, которые мы получаем бесплатно, включают: нам не нужны преобразования часовых поясов, мы можем делать все в центральное время. Вычисление разницы в часах встроено, требуется только один вызов метода.

Укажите языковой стандарт для вашего средства форматирования, или он сломается, когда однажды ваш код будет работать на JVM с неанглийским языковым стандартом по умолчанию. Укажите Центральное время США как Америка / Чикаго. Всегда используйте этот формат регион / город для часовых поясов. CST устарел и также лжет, так как он дает вам CDT в это время года.

Вопрос: Разве java.time не требует Android API уровня 26 или выше?

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

  • В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26) современный API поставляется встроенным.
  • В не-Android Java 6 и 7 получают ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более старых) Android используется Androidиздание ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

0 голосов
/ 11 октября 2019

Используйте следующий код для результата

                SimpleDateFormat dateFormat = new SimpleDateFormat("d MMM yyyy hh:mm a");
                TimeZone timeZone = TimeZone.getTimeZone("CST");
                dateFormat.setTimeZone(timeZone);

                Date event_date = dateFormat.parse("2 Nov 2019 07:30 pm");
                Date current_date = new Date();
                long diff = event_date.getTime() - current_date.getTime();
                long Days = diff / (24 * 60 * 60 * 1000);
                long Hours = diff / (60 * 60 * 1000) % 24;
                long Minutes = diff / (60 * 1000) % 60;
                long Seconds = diff / 1000 % 60;

                Log.i(TAG, Hours + "," + Minutes + "," + Seconds);
...