Подтвердить что ты не робот

Groovy String to Date

Я кодирую это с помощью Groovy

В настоящее время я пытаюсь преобразовать строку, которая у меня есть, без необходимости делать что-то слишком утомительное.

String theDate = "28/09/2010 16:02:43";
def newdate = new Date().parse("d/M/yyyy H:m:s", theDate)

Выход:

Tue Aug 10 16:02:43 PST 2010

Приведенный выше код работает очень хорошо, однако, когда моя строка изменяется на что-то вроде:

String testDate = "Tue Aug 10 16:02:43 PST 2010"
def newerdate = new Date().parse("d/M/yyyy H:m:s", testDate)

Он говорит мне, что "такого значения для Tue нет". Я попытался выставить "E" в синтаксисе даты, но он сказал, что дата не может быть проанализирована.

Может кто-нибудь объяснить, как мне следует разбирать второй пример?

4b9b3361

Ответ 1

Первым аргументом parse() является ожидаемый формат. Вы должны изменить это на Date.parse("E MMM dd H:m:s z yyyy", testDate), чтобы он работал. (Обратите внимание, что вам не нужно создавать новый объект Date, это статический метод)

Если вы заранее не знаете, какой формат, вам придется найти для него специальную библиотеку синтаксического анализа. В Ruby есть библиотека под названием Chronic, но я не знаю эквивалента Groovy. Изменить. Существует Java-порт библиотеки, называемый jChronic, вы можете проверить его.

Ответ 2

JChronic - ваш лучший выбор. Вот пример, который добавляет метод .fromString() к классу Date, который анализирует все, что вы можете на него набросить:

Date.metaClass.'static'.fromString = { str ->
    com.mdimension.jchronic.Chronic.parse(str).beginCalendar.time
}

Вы можете называть это следующим образом:

println Date.fromString("Tue Aug 10 16:02:43 PST 2010")
println Date.fromString("july 1, 2012")
println Date.fromString("next tuesday")

Ответ 4

Переходим к Groovy способам "отличить" String до Date, я столкнулся с этой статьей: http://www.goodercode.com/wp/intercept-method-calls-groovy-type-conversion/

Автор использует Groovy metaMethods, чтобы позволить динамически расширять поведение любого метода класса asType. Они предоставляют класс Convert, который обертывает сложность Groovy, что делает тривиальным добавлять пользовательское преобразование типа as из любого типа в любой другой:

Convert.from( String ).to( Date ).using { new java.text.SimpleDateFormat('MM-dd-yyyy').parse(value) }

def christmas = '12-25-2010' as Date

Это удобное и мощное решение, но я бы не рекомендовал его кому-то, кто не знаком с компромиссами и ловушками возиться с метаклассами.

Ответ 5

Date#parse устарел. Альтернатива:

java.text.DateFormat#parse 

thereFore:

 new SimpleDateFormat("E MMM dd H:m:s z yyyy", Locale.ARABIC).parse(testDate)

Обратите внимание, что SimpleDateFormat представляет собой реализацию DateFormat

Ответ 6

Я думаю, что лучший простой способ в этом случае - использовать parseToStringDate, который является одним из улучшений JDK Groovy:

Разбор строки, соответствующей шаблону EEE MMM dd HH: mm: ss zzz yyyy содержащие только US-locale-константы (например, Sat по субботам). Такой строка генерируется методом toString Date

Пример:

println (Date.parseToStringDate("Tue Aug 10 16:02:43 PST 2010").format('MM-dd-yyyy'))​

Надеюсь, что это поможет.