Date.plus не работает в 2.5.4 Groovy Runtime, какая альтернатива? - PullRequest
0 голосов
/ 03 октября 2019

Мы хотим добавить дни к текущей дате и отформатировать ее особым образом. Это было решено в Groovy 2.4.13, и следующие манипуляции с датами работают нормально:

​today = new Date()+90;today.format('yyyy-MM-dd HH:mm:ss.S');

Результат: 2019-12-02 08: 07: 15.294

В Groovy 2.5.4 то же самоеВыражение выдает это исключение:

groovy.lang.MissingMethodException: Нет сигнатуры метода: java.util.Date.plus () применим для типов аргументов: (целочисленные) значения: [90] Возможные решения: parse (java.lang.String), split (groovy.lang.Closure), использование ([Ljava.lang.Object;), is (java.lang.Object), wait (), clone () в Script1.run(Script1.groovy: 3)

Мне удалось воспроизвести это поведение в "Groovy sandboxes" онлайн:

Работает нормально здесь: Groovy-Playground (Версия 2.4.1.5) Сбой здесь: groovyconsole (Версия 2.5.7)

Какая рабочая альтернатива в этом случае? Я читал о новом API даты, но не смог найти подробности о том, как его использовать, с манипулированием датой (например, + 90 дней).

Ответы [ 3 ]

2 голосов
/ 04 октября 2019

Я согласен с рекомендациями Ole VV по использованию нового API Date / Time. Вот как вы могли бы написать его образец Java в более Groovy стиле.

// you can assemble aggregate types by left shifting the aggregates
// I'm not endorsing this approach, necessarily, just pointing it out as an alternative 
ZonedDateTime now = LocalDate.now() << LocalTime.now() << ZoneId.of('Africa/Bamako')

// the plus operator is overloaded
ZonedDateTime in90Days = now + 90

// you can pass a String to format without needed a full DateTimeFormatter instance
println in90Days.format('uuuu-MM-dd HH:mm:ss.S')
2 голосов
/ 03 октября 2019

Хотя Groovy добавляет дополнительную поддержку для старого класса Java Date, я все же считаю, что вы не должны его использовать. Он всегда был плохо спроектирован и сейчас давно устарел. Вместо этого используйте java.time, современный Java API даты и времени. Я сожалею, что мне придется доверить вам перевод с Java-кода.

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.S");
    ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Africa/Bamako"));
    ZonedDateTime in90Days = now.plusDays(90);
    System.out.println(in90Days.format(formatter));

Вывод при запуске только сейчас был:

2020-01-01 08:37:13.3

Пожалуйста, укажите желаемый часовой пояс, если это не Африка / Бамако.

Ссылка: Учебное пособие по Oracle: Дата и время объясняя, как использовать java.time.

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

Взгляните на TimeCategory

import groovy.time.TimeCategory
def theDate = use(TimeCategory){new Date() + 90.days}.format('yyyy-MM-dd HH:mm:ss.S')
...