как добавить дни с помощью даты без использования календаря - PullRequest
0 голосов
/ 02 марта 2019
public XDate addDays(long a) {
    long x = super.getTime();
    a *= (24 * 60 * 60 * 1000);
    Date dd = new Date(x + a);
    XDate d = new XDate(dd.getDate() + date - 1, dd.getMonth(), dd.getYear());
    return d;
}

, поэтому я создал класс с именем XDate, который расширяет java.util.Date, но делает вещи немного по-другому, например, getMonth возвращает значение от 1 до 12, а не от 0 до 11, теперь я хочу сделатьфункция с именем addDays(int a), которая в основном использует текущую дату (дата может быть отредактирована в конструкторе) и добавляет число a в раздел дня, используя Date.getTime() и конструктор Date, который получает миллисекунды.

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

tl; dr

LocalDate
.now( 
    ZoneId.of( "Pacific/Auckland" ) 
)
.plusDays( 3 ) 

java.time

Вы используете ужасные классы даты и времени, которые были вытеснены годы назад классами java.time спринятие JSR 310. Никогда не используйте Date снова.

По-видимому, вы начинаете с long в виде количества миллисекунд с момента обращения эпохи первого момента 1970 года в UTC.1970-01-01T00: 00: 00Z.Считайте это число как Instant, момент в UTC с разрешением наносекунд.

Instant instant = Instant.ofEpochMilli( myCountOfMilliseconds ) ;

Когда вы говорите «добавить дни», что вы конкретно имеете в виду?

Вы имеете в виду 24-часовые куски времени ?Используйте Duration.

Duration d = Duration.ofDays( 3 ) ;  // Add three multiplied by 24 hours.
Instant instantLater = instant.plus( d ) ;

Вы имеете в виду дней, как в датах в календаре?Часовой пояс имеет решающее значение при определении даты.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи в Париж Франция - это новый день, в то время как "вчера" в Монреаль Квебек .

Если часовой пояс не указан,JVM неявно применяет свой текущий часовой пояс по умолчанию.Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться.Лучше явно указать желаемый / ожидаемый часовой пояс в качестве аргумента.Если критично, подтвердите зону с вашим пользователем.

Укажите правильное имя часового пояса в формате Continent/Region, например America/Montreal, Africa/Casablanca или Pacific/Auckland,Никогда не используйте 2-4 буквенные сокращения, такие как EST или IST, поскольку они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
ZonedDateTime zdt = instant.atZone( z ) ;
ZonedDateTime zdtLater = zdt.plusDays( 3 ) ;  // Add three calendar days, with same time-of-day but adjusted as needed to handle anomalies such as Daylight Saving Time (DST).

Если вам нужна только дата без времени суток и без часового пояса, извлеките LocalDate.

LocalDate ld = zdt.toLocalDate() ;
LocalDate ldLater = ld.plusDays( 3 ) ;

, используя в основном текущийdate

Если вы хотите начать только с даты, используйте LocalDate.now.

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate today = LocalDate.now( z ) ;
LocalDate threeDaysFromToday = today.plusDays( 3 ) ;

About java.time

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

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

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

Вы можете обмениваться 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 голосов
/ 02 марта 2019

Поскольку ваши XDate всегда представляют дату и время с часовым поясом UTC, вы можете просто добавить 86400000 к внутреннему значению времени, которое представляет собой миллисекунды с начала эпохи (1970-01-01 00:00:00).

Как только вы захотите работать с датами, представляющими даты и время разных часовых поясов, вы не сможете этого сделать, потому что есть дни с 23 часами или днями по 25 часов, если в часовом поясе есть летнее время.В этом случае вам нужно отслеживать даты, когда происходят эти изменения, и обрабатывать их соответствующим образом.

Или вместо этого вы используете Calendar.

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