Проблемы с преобразованием заданной даты в минуты - PullRequest
1 голос
/ 17 июня 2020

У меня есть функция, в которой я получаю дату и конвертирую ее в миллисекунды, а затем меняю ее на минуты. Конечное значение всегда положительное, но по неизвестным причинам в период с 5 по 29 июня результирующее значение оказывается отрицательным. Из-за этого страдают мои последующие операции, ожидающие положительных значений. Какая root причина этой проблемы? Я прикрепил свой фрагмент кода с разными снимками результатов за разные даты. И может ли кто-нибудь предложить обходной путь для этой проблемы? Я использую java версию 1.8.0_161

String democurrentDate = "Wed Jul 4 17:28:41 IST 2020";                    
Date entrydatecom = new Date();
entrydatecom = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy").parse(democurrentDate);
System.out.println("The current date in correct format for milli ==>" + entrydatecom);                    
int milli1 = (int) entrydatecom.getTime();
System.out.println("Milli === > " + milli1);
long minutesforcurr = TimeUnit.MILLISECONDS.toMinutes(milli1);
System.out.println("The minutes for current date is ==> " + minutesforcurr);

Когда дата 4 июля

Текущий дата в правильном формате для milli ==> Sat Jul 04 17:28:41 IST 2020
Milli ===> 431054184
Минуты для текущей даты ==> 7184

Если дата 4 июня

Текущая дата в правильном формате для милли ==> Четверг, 4 июня 17:28:41 IST 2020
Милли ===> 2134021480
Минуты для текущей даты ==> 35567

Если дата 17 июня

Текущая дата в правильном формате для milli ==> среда, 17 июня 17:28:41 IST 2020
Milli ===> -1037745816
Минуты для текущей даты ==> -17295

Когда дата 22 июня

Текущая дата в правильном формате для milli ==> Mon Jun 22 17:28:41 IST 2020
Milli ===> -605745816
Минуты для текущей даты: ==> -10095

Ответы [ 3 ]

4 голосов
/ 17 июня 2020

Проблема

Основная проблема в вашей строке даты / времени заключается в том, что 4 июля 2020 года - Sat, тогда как вы написали Wed, и поэтому либо он не будет правильно проанализирован, либо вызовет исключение быть брошенным.

Кроме того, я рекомендую вам использовать современный API даты / времени вместо использования сломанных java.util.Date и SimpleDateFormat.

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

class Main {
    public static void main(String[] args) {
        // Define format
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM d HH:mm:ss zzz yyyy");

        // Parse to ZonedDateTime
        ZonedDateTime zdt = LocalDateTime.parse("Sat Jul 4 17:28:41 IST 2020", formatter)
                .atZone(ZoneId.of("Asia/Kolkata"));

        // Calculate duration in minute
        long minutes = ZonedDateTime.now(ZoneId.of("Asia/Kolkata")).until(zdt, ChronoUnit.MINUTES);

        // Display
        System.out.println(minutes);
    }
}

Вывод:

24333
3 голосов
/ 17 июня 2020

Вы должны использовать long, не приводите к int.

2 голосов
/ 17 июня 2020

use: Long milli1 = entrydatecom.getTime(); Когда вы приводите long к int, вы теряете много данных. число int может поддерживать число от -2147483648 до 2147483647 длинное число от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807

Например, если вы тестируете "среда, 17 июня, 17:28:41 IST 2020", количество мс будет: 1592407721000 (> 2147483647) не влезет

...