Добавить количество дней, используя простой формат в Java - PullRequest
0 голосов
/ 03 октября 2018

У нас есть фрагмент кода Java здесь

import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatExample {
public static void main(String[] args) {
    Date date = new Date();
    int days = 5;
    SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    String strDate= formatter.format(date.getTime() + (days*86400000));
    System.out.println(strDate);
}
}

, чтобы добавить n нет.дней до сегодняшней даты.Результат будет верным до n=24, но даст предыдущий месяц 'после n=24.Почему это так?

Ответы [ 4 ]

0 голосов
/ 03 октября 2018

tl; dr

LocalDate               // Represent a date-only, without a time-of-day and without a time zone.
.now()                  // Capture the current date, as seen through your JVM’s current default time zone. Better to pass a `ZoneId` as the optional argument.
.plusDays( 5 )          // Add five days, returning a new `LocalDate` object. Per the Immutable Objects pattern, a new object is produced rather than changing (“mutating”) the original.
.format(                // Generate text representing the date value of our `LocalDate` object.
    DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) // Define a formatting pattern to suit your taste. Or call the `.ofLocalized…` methods to localize automatically. 
)                       // Returns a `String`.

java.time

Date класс представляет момент в UTC, дату с временем суток и смещение отUTC ноль.Неправильный класс для использования со значениями только для даты.

Избегайте использования ужасных старых устаревших классов даты и времени, таких как Calendar, Date и SimpleDateFormat.Эти классы были вытеснены несколько лет назад классами java.time .

Не отслеживать дни как количество секунд или миллисекунд.Дни не всегда 24 часа, а годы не всегда 365 дней.

LocalDate

Вместо этого используйте LocalDate класс.

LocalDate today = LocalDate.now() ;
LocalDate later = today.plusDays( 5 ) ;

Преобразование

Лучшее в Избегайте старых классов в целом.Но если вам необходимо взаимодействовать со старым кодом, который еще не обновлен до java.time классов, вы можете конвертировать туда и обратно.Вызовите новые методы, добавленные к старым классам.

Для Date вам нужно добавить время суток.Я ожидаю, что вы захотите пойти с первого момента дня.И я предполагаю, что вы хотите поместить дату в формате UTC, а не в часовой пояс.Мы должны пройти через объект OffsetDateTime, чтобы добавить время суток и смещение.Для смещения мы используем константу ZoneOffset.UTC.Затем мы извлекаем более простой объект класса Instant для преобразования в java.util.Date.

OffsetDateTime odt = OffsetDateTime.of( later , LocalTime.MIN , ZoneOffset.UTC ) ;  // Combine the date with time-of-day and with an offset-from-UTC.
Instant instant = odt.toInstant() ;  // Convert to the more basic `Instant` class, a moment in UTC, always UTC by definition.
java.util.Date d = java.util.Date.from( instant ) ;  // Convert from modern class to legacy class.

Идя в другом направлении:

Instant instant = d.toInstant() ;  // Convert from legacy class to modern class. 

О java.time

java.time Framework встроен в 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 голосов
/ 03 октября 2018

Используйте days*86400000L, чтобы сделать это long, в противном случае значение int будет переполнено.

0 голосов
/ 03 октября 2018

Попробуйте это в своем коде:

Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.DATE, 5); 

strDate = formatter.format(cal.getTime());
0 голосов
/ 03 октября 2018

Проблема в том, что int is overflowing

считают

    int days = 25;
    int d = days*86400000;
    System.out.println(d);

попытаться

    int days = 25;
    long d = days*86400000L;
    System.out.println(d);
...