Java возвращает BigInteger из строки - PullRequest
0 голосов
/ 24 декабря 2018

Я генерирую число с даты, я использую Integer.parseInt (myDateNumberString).

Моя проблема в том, что если число слишком велико, оно выдаст мне ошибку.

public Integer currentDate(){
        String current_date = new SimpleDateFormat("yyyyMMddHHmm").format(Calendar.getInstance().getTime());
        //int _current_date = Integer.parseInt(current_date); // Error, too big number
        int _current_date = new BigInteger(current_date).intValue();
        return _current_date; // Error, output: -51212897
    }

Я хочу получить значение как 201812250203 Если мой формат даты без mm, то все в порядке, но мне нужно объявить его.

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

tl; dr

Используйте строки ISO 8601 для обмена значениями даты и времени, а не число, подделываемое как дата-время.Как правило, лучше всего обмениваться моментами в UTC, а не в своем часовом поясе.

Instant
.now()
.truncatedTo( ChronoUnit.MINUTES)
.toString()

2018-12-24T19: 32: 00Z

Чтобы свести к минимуму использование разделителейиспользуйте «базовую» вариацию форматов ISO 8601.Мы сохраняем T, отделяя часть год-месяц-день от части час-минута.Отбрасывать Z, указывающий UTC, не рекомендуется, но если вы настаиваете.

OffsetDateTime
.now( ZoneOffset.UTC )
.format(
    DateTimeFormatter.ofPattern( "uuuuMMdd'T'HHmm" ) 
)

20181224T1936

Использование целого числа для представления строки даты и времени не рекомендуется, но если вы настаиваете.

new BigInteger( 
    OffsetDateTime
    .now( ZoneOffset.UTC )
    .format(
        DateTimeFormatter.ofPattern( "uuuuMMddHHmm" ) 
    )
)
.toString()

201812241939

32-разрядное целое число (int, Integer) ограничено 2 147 483 647.Ваш фальшивый datetime номер 2,018,123,581,939 слишком велик для этого.Вы можете использовать 64-битное целое число (long, Long).Но, опять же, я должен сказать, что это плохой способ представления значений даты и времени.

new BigInteger( 
    OffsetDateTime
    .now( ZoneOffset.UTC )
    .format(
        DateTimeFormatter.ofPattern( "uuuuMMddHHmm" ) 
    )
)
.longValue()

201812241939

Или пропустите BigInteger и используйте Long.

Long
.parseLong(
    OffsetDateTime
    .now( ZoneOffset.UTC )
    .format(
        DateTimeFormatter.ofPattern( "uuuuMMddHHmm" ) 
    )
)

201812241939

java.time

Вы используете ужасные старые классы даты и времени (SimpleDateFormat, Calendar) которые были вытеснены несколько лет назад классами java.time с принятием JSR 310.

ZonedDateTime

Чтобы получить текущую дату и время, как видночерез настенные часы, используемые людьми определенного региона, укажите ZoneId, чтобы получить ZonedDateTime.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

DateTimeFormatter

Чтобы сгенерировать строку в формате ГГГГММДДЧЧММ, используйте класс DateTimeFormatter.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuuMMddHHss" ) ;
String output = zdt.format( f ) ;

Используйте соответствующие типы данных

Я настоятельно не рекомендую вам представлять это значение как число.Для значений даты и времени используйте объекты даты и времени ( java.time объекты).Для обмена значениями даты и времени в виде текста генерируйте строки в стандартном формате ISO 8601 .Классы java.time используют форматы ISO 8601 по умолчанию при разборе / генерации строк.Метод ZonedDateTime::toString разумно расширяет стандарт, добавляя название часового пояса в квадратных скобках.

String output = zdt.toString() ;  // Generate text in standard ISO 8601 format wisely extended to append the name of the time zone in square brackets.

Но если вы настаиваете на выполнении числовых операций, то здесь.

BigInteger bigInteger = new BigInteger( zdt.format( f ) ) ;

О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздних версий - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесено в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации связки Android java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 24 декабря 2018

Измените тип возвращаемого значения метода на long и возвращаемую переменную:

EDIT: избавьтесь от метода .intValue () и измените тип возвращаемого значения метода на BigInteger и переменнуютоже.

public static void main(String[] args) {
    System.out.println(currentDate());
}

public static BigInteger currentDate() {
    String current_date = new SimpleDateFormat("yyyyMMddHHmm").format(Calendar.getInstance().getTime());
    // int _current_date = Integer.parseInt(current_date);
    BigInteger _current_date = new BigInteger(current_date);
    return _current_date;
}
0 голосов
/ 24 декабря 2018

Вы можете использовать BigInteger number = new BigInteger(string);, который анализирует данную строку как BigInteger.

документы говорят:

Создает новый BigInteger путем анализазначение.Строковое представление состоит из необязательного знака плюс или минус, за которым следует непустая последовательность десятичных цифр.Цифры интерпретируются как если бы Character.digit (char, 10).

...