Groovy String на сегодняшний день - PullRequest
65 голосов
/ 29 сентября 2010

Я кодирую это с 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)

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

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

Ответы [ 7 ]

67 голосов
/ 29 сентября 2010

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

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

27 голосов
/ 29 сентября 2010

Попробуйте:

def date = Date.parse("E MMM dd H:m:s z yyyy", dateStr)

Вот шаблоны для форматирования дат

24 голосов
/ 30 сентября 2010

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")
5 голосов
/ 04 февраля 2015

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

Автор использует мета-методы Groovy, чтобы динамически расширять поведение любого класса asType метода. Вот код с сайта.

class Convert {
    private from
    private to

    private Convert(clazz) { from = clazz }
    static def from(clazz) {
        new Convert(clazz)
    }

    def to(clazz) {
        to = clazz
        return this
    }

    def using(closure) {
        def originalAsType = from.metaClass.getMetaMethod('asType', [] as Class[])
        from.metaClass.asType = { Class clazz ->
            if( clazz == to ) {
                closure.setProperty('value', delegate)
                closure(delegate)
            } else {
                originalAsType.doMethodInvoke(delegate, clazz)
            }
        }
    }
}

Они предоставляют класс 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

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

3 голосов
/ 31 октября 2014

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

java.text.DateFormat#parse 

там:

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

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

0 голосов
/ 11 ноября 2018

Ниже описывается способ разработки нашего приложения.

import java.text.SimpleDateFormat

String newDateAdded = "2018-11-11T09:30:31"
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")
Date dateAdded = dateFormat.parse(newDateAdded)

println(dateAdded)

Вывод выглядит как

Sun Nov 11 09:30:31 GMT 2018

В вашем примере мы могли бы немного подстроиться под ваши нужды. На твоем месте я сделаю:

String datePattern = "d/M/yyyy H:m:s"
String theDate = "28/09/2010 16:02:43"
SimpleDateFormat df = new SimpleDateFormat(datePattern)
println df.parse(theDate)

Надеюсь, это сильно вам поможет.

0 голосов
/ 09 ноября 2017

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

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

Пример:

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

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

...